我正在使用EF CF方法为一个使用MySQL的网站进行开发。 由于某些原因,EF在我的Post表中创建了一个名为“Discriminator”的列,并包含VARCHAR“Post”。
为什么会创建这个列?我能做些什么来避免它被创建吗?拥有这个列有什么优势吗?
我正在使用EF CF方法为一个使用MySQL的网站进行开发。 由于某些原因,EF在我的Post表中创建了一个名为“Discriminator”的列,并包含VARCHAR“Post”。
为什么会创建这个列?我能做些什么来避免它被创建吗?拥有这个列有什么优势吗?
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
)填充。
您可以在从基类继承的模型中添加[NotMapped]
数据注释来停止创建列。这将告诉EF不要将您的类添加到未来的迁移中,以删除区分器列。
public class BaseClass
{
}
[NotMapped]
public class InheritingClass : BaseClass
{
}
为了完整性,如果您想使用流畅的API来防止继承类被映射为实体(从而停止创建鉴别器列),您可以执行以下操作:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Ignore<InheritingClass>();
}
Discriminator
列。我上面的代码只是一个例子。如果Post
本身没有派生,但如果有其他实体从Post
派生,则会得到相同的结果。 - Slauma