实体框架代码首先创建“ discriminator”列


75

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

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

Answers:


119

Discriminator在“按层次结构表”继承方案中,此列是必需的。例如,如果您有这样的模型...

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 2011年

2
@lejon:您可以显示问题中的模型吗?Discriminator除了继承上下文,我从未见过专栏。我上面的代码只是一个例子。例如,如果Post它本身不是派生的,但是如果还有其他实体是从派生的,则将得到相同的结果Post
Slauma 2011年

1
我懂了!来自Post的另一个模型。谢谢回答!
kasperhj 2011年

8

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

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

1

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

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Ignore<InheritingClass>();
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.