[英]Entity Framework: Soft Delete and Table per Type
我正在尝试使用以下方法来实现“软删除”模式: https : //stackoverflow.com/a/18985828/213725
但是,我很难为每个类型的表继承实现它。 假设我有Entity
映射到表“ Entity”,其后代ConcreteEntity
映射到表“ ConcreteEntity”。 我在“实体”表中具有IsDeleted
列,以指定该实体是否被“删除”。 我在OnModelCreating
尝试做的事情如下所示:
modelBuilder.Entity<Entity>()
.Map<Entity>(m =>
{
m.ToTable("Entity");
m.Requires("IsDeleted").HasValue(false);
})
.Map<ConcreteEntity>(m =>
{
m.ToTable("ConcreteEntity");
});
不过我不工作。 我收到以下错误:
(59,10):错误3032:从第59行开始的映射片段的问题142:EntityTypes Entity,ConcreteEntity正在映射到表Entity中的相同行。 映射条件可用于区分这些类型映射到的行。
有什么想法我做错了吗?
软删除技术使用鉴别符字段来确保EF始终过滤出软删除的实体。 但是,区分字段是为实现逐层表继承而设计的。 我相信EF在到达ToTable("ConcreteEntity")
之前就已经ToTable("ConcreteEntity")
那是因为EF解释了这一行: m.Requires("IsDeleted").HasValue(false);
表示您正在使用TPH,并且通过将IsDeleted=false
添加到sql可以从单个表中检索实体。 我认为EF不会让您结合使用鉴别符和Table-Per-Type继承。
事实证明,使用鉴别器将TPT和“软删除”模式组合在一起非常棘手。
因此,为了使其工作,我将Entity
抽象化并将IsDeleted
列移至ConcreteEntity
表。 然后,我更改了映射,如下所示:
modelBuilder.Entity<Entity>().Map(m => m.ToTable("Entity"));
modelBuilder.Entity<ConcreteEntity>().Map(m =>
{
m.ToTable("ConcreteEntity");
m.Requires("IsDeleted").HasValue(false);
});
我不认为这是最好的方法,但至少可以奏效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.