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

kas*_*rhj 67 entity-framework

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

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

Sla*_*uma 111

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

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

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

public class OtherEntity : BaseEntity
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你的好回答。但是,我的模型不是派生的。为什么 EF 仍然制作鉴别器? (2认同)
  • @lejon:你能在你的问题中展示模型吗?除了在继承的上下文中,我从未见过“鉴别器”列。我上面的代码只是一个例子。例如,如果`Post` 本身不是派生的,但是如果有其他实体派生自`Post`,你会得到相同的结果。 (2认同)

Pon*_*ian 5

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

public class BaseClass
{
}
[NotMapped]
public class InheritingClass : BaseClass 
{
}
Run Code Online (Sandbox Code Playgroud)