【问题标题】:Entity framework code first creates "discriminator" column实体框架代码首先创建“鉴别器”列
【发布时间】:2011-09-12 20:43:44
【问题描述】:

我正在为一个带有 MySQL 的网站使用 EF CF 方法。 出于某种原因,EF 在我的 Post 表中创建了一个名为“Discriminator”的列,并包含 VARCHAR“Post”。

为什么要创建此列?我可以做些什么来避免它被创建吗?有这个专栏有什么好处吗?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    Discriminator 列在Table-Per-Hierarchy 继承方案中使用和必需。例如,如果您有这样的模型...

    public abstract class BaseEntity
    {
        public int Id { get; set; }
        //...
    }
    
    public class Post : BaseEntity
    {
        //...
    }
    
    public class OtherEntity : BaseEntity
    {
        //...
    }
    

    ... 并使BaseEntity 成为模型的一部分,例如通过将DbSet<BaseEntity> 添加到派生上下文中,Entity Framework 将默认将此类层次结构映射到单个表中,但会引入一个特殊列 - Discriminator - 区分存储在此表中的不同类型(PostOtherEntity)。此列将填充类型的名称(同样是 PostOtherEntity)。

    【讨论】:

    • 感谢您的好回答。但是,我的模型不是派生的。为什么EF还是做判别器?
    • @lejon:你能在你的问题中展示模型吗?除了在继承的上下文中,我从未见过Discriminator 列。我上面的代码只是一个例子。例如,如果Post 本身不是派生的,但如果有其他实体从Post 派生,您会得到相同的结果。
    • 我明白了!另一个源自 Post 的模型。感谢您的回答!
    【解决方案2】:

    您可以通过将[NotMapped] 数据注释添加到从您的基类继承的模型来停止创建列。这将告诉 EF 不要将您的类添加到未来的迁移中,删除鉴别器列。

    public class BaseClass
    {
    }
    [NotMapped]
    public class InheritingClass : BaseClass 
    {
    }
    

    【讨论】:

      【解决方案3】:

      为了完整起见,如果您想使用 fluent API 来阻止继承类与实体进行映射(从而阻止正在创建的鉴别器列),您可以执行以下操作:

      protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
          modelBuilder.Ignore<InheritingClass>();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        相关资源
        最近更新 更多