我正在尝试使用EF7实现一个“软删除”。我的Item
表有一个名为IsDeleted
的字段,类型为bit
。我在SO周围和其他地方看到的所有示例都使用了这样的东西:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Item>().Map(m => m.Requires("IsDeleted").HasValue(false));
}
但是Map()
不再是ModelBuilder
的一种方法。
编辑:让我澄清一下。我现在最感兴趣的只是读取数据。我想让EF自动过滤掉我的Item
表中IsDeleted == 1
(或true)的所有记录。我不希望在每个查询的末尾都需要一个&& x.IsDeleted == false
。
发布于 2017-08-16 01:28:13
如果您可以迁移到EF Core2.0,则可以使用模型级查询过滤器https://docs.microsoft.com/en-us/ef/core/what-is-new/index
如果你使用EF Core 1.0,你可以使用一些可用的EF Core特性:
继承https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/inheritance
阴影属性https://docs.microsoft.com/en-us/ef/core/modeling/shadow-properties
public class Attachment : AttachmentBase
{}
public abstract class AttachmentBase
{
public const string StatePropertyName = "state";
public Guid Id { get; set; }
}
public enum AttachmentState
{
Available,
Deleted
}
public class AttachmentsDbContext : DbContext
{
public AttachmentsDbContext(DbContextOptions options)
: base(options)
{
}
public DbSet<Attachment> Attachments { get; set; }
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
IEnumerable<EntityEntry<Attachment>> softDeletedAttachments = ChangeTracker.Entries<Attachment>().Where(entry => entry.State == EntityState.Deleted);
foreach (EntityEntry<Attachment> softDeletedAttachment in softDeletedAttachments)
{
softDeletedAttachment.State = EntityState.Modified;
softDeletedAttachment.Property<int>(AttachmentBase.StatePropertyName).CurrentValue = (int)AttachmentState.Deleted;
}
return base.SaveChangesAsync(cancellationToken);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<AttachmentBase>()
.HasDiscriminator<int>(AttachmentBase.StatePropertyName)
.HasValue<Attachment>((int)AttachmentState.Available);
modelBuilder.Entity<AttachmentBase>().Property<int>(AttachmentBase.StatePropertyName).Metadata.IsReadOnlyAfterSave = false;
modelBuilder.Entity<Attachment>()
.ToTable("available_attachment");
modelBuilder.Entity<AttachmentBase>()
.ToTable("attachment");
base.OnModelCreating(modelBuilder);
}
}
https://stackoverflow.com/questions/37932339
复制相似问题