实体框架代码首先创建“鉴别器”列

时间:2011-09-12 20:43:44

标签: entity-framework

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

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

3 个答案:

答案 0 :(得分:106)

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

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

public class Post : BaseEntity
{
    //...
}

public class OtherEntity : BaseEntity
{
    //...
}

...并创建模型的BaseEntity部分,例如通过向派生上下文添加DbSet<BaseEntity>,实体框架将默认将此类层次结构映射到单个表中,但是一个特殊列 - Discriminator - 用于区分此表中存储的不同类型(PostOtherEntity)。此列将填充类型名称(再次PostOtherEntity)。

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

为完整起见,如果您想使用fluent API阻止继承的类与实体进行映射(并因此阻止创建鉴别符列),则可以执行以下操作:

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