我在使用MySQL的网站上使用EF CF方法。 出于某种原因,EF在我的Post表中创建一个名为“Discriminator”的列,并包含VARCHAR“Post”。
为什么要创建此列?我可以做些什么来避免它被创建吗?有这个专栏有什么好处吗?
答案 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
- 用于区分此表中存储的不同类型(Post
或OtherEntity
)。此列将填充类型名称(再次Post
或OtherEntity
)。
答案 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>();
}