【问题标题】:Entity Framework: Soft Delete and Table per Type实体框架:每种类型的软删除和表
【发布时间】:2015-02-13 09:14:22
【问题描述】:

我正在尝试使用以下方法实现软删除模式: https://stackoverflow.com/a/18985828/213725

但是,我在为 Table Per Type 继承实现它时​​遇到了困难。假设我将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 被映射到 表实体中的相同行。映射条件可用于 区分这些类型映射到的行。

任何想法我做错了什么?

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

    软删除技术使用鉴别器字段来确保 EF 始终过滤掉软删除的实体。但是鉴别器字段的设计目的是为了实现 Table-Per-Hierarchy 的继承。我相信 EF 在到达 ToTable("ConcreteEntity")

    之前就已经倒下

    这是因为 EF 将这一行解释为:m.Requires("IsDeleted").HasValue(false); 表示您正在使用 TPH,并且将通过将 IsDeleted=false 添加到 sql 来从单个表中检索实体。我不相信 EF 会让你将鉴别器和 Table-Per-Type 继承结合起来。

    【讨论】:

      【解决方案2】:

      事实证明,将 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);
      });
      

      我不相信这是最好的方法,但至少它有效。

      【讨论】:

      • 我对 EF7 有同样的要求。您对您的解决方案还满意吗? :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多