繁体   English   中英

实体框架:软删除和每种类型的表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM