实体框架Code First创建“鉴别器”列

80

我正在使用EF CF方法为一个使用MySQL的网站进行开发。 由于某些原因,EF在我的Post表中创建了一个名为“Discriminator”的列,并包含VARCHAR“Post”。

为什么会创建这个列?我能做些什么来避免它被创建吗?拥有这个列有什么优势吗?

3个回答

127

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)填充。


2
谢谢你的好回答。然而,我的模型没有被派生。为什么EF还是会生成鉴别器? - kasperhj
2
@lejon:你能展示一下你问题中的模型吗?我从未见过除了继承上下文之外的Discriminator列。我上面的代码只是一个例子。如果Post本身没有派生,但如果有其他实体从Post派生,则会得到相同的结果。 - Slauma
1
我明白了!又是一个从Post派生的模型。谢谢你的回答! - kasperhj

12

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

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

4

为了完整性,如果您想使用流畅的API来防止继承类被映射为实体(从而停止创建鉴别器列),您可以执行以下操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接