【发布时间】:2011-09-12 20:43:44
【问题描述】:
我正在为一个带有 MySQL 的网站使用 EF CF 方法。 出于某种原因,EF 在我的 Post 表中创建了一个名为“Discriminator”的列,并包含 VARCHAR“Post”。
为什么要创建此列?我可以做些什么来避免它被创建吗?有这个专栏有什么好处吗?
【问题讨论】:
标签: entity-framework
我正在为一个带有 MySQL 的网站使用 EF CF 方法。 出于某种原因,EF 在我的 Post 表中创建了一个名为“Discriminator”的列,并包含 VARCHAR“Post”。
为什么要创建此列?我可以做些什么来避免它被创建吗?有这个专栏有什么好处吗?
【问题讨论】:
标签: entity-framework
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 - 区分存储在此表中的不同类型(Post 或 OtherEntity)。此列将填充类型的名称(同样是 Post 或 OtherEntity)。
【讨论】:
Discriminator 列。我上面的代码只是一个例子。例如,如果Post 本身不是派生的,但如果有其他实体从Post 派生,您会得到相同的结果。
您可以通过将[NotMapped] 数据注释添加到从您的基类继承的模型来停止创建列。这将告诉 EF 不要将您的类添加到未来的迁移中,删除鉴别器列。
public class BaseClass
{
}
[NotMapped]
public class InheritingClass : BaseClass
{
}
【讨论】:
为了完整起见,如果您想使用 fluent API 来阻止继承类与实体进行映射(从而阻止正在创建的鉴别器列),您可以执行以下操作:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Ignore<InheritingClass>();
}
【讨论】: