实体框架迁移增加了子类的属性



在一个c#项目中,我有一个dbcontext,它引用了我的域模型的实体。当我用

创建迁移代码时

添加移民mysetup

命令,实体框架(我使用6.1版和sqlserver(不仅为定义的实体创建迁移,而且还添加了子类的属性(即使它们处于不同的命名空间,并且在dbcontext中不使用(。

示例:

class MyContext : DbContext
{
   public IDbSet<User> Users { get; set; }
   ...
}
class User
{
   public long Id { get; set; }
   ...
}

,在另一个地方,我有一个在上下文中未使用的类

class UserExtended : User
{
   public string AdditionalPropertyNotForEF { get; set; }
   ...
}

然后用add迁移创建的迁移类看起来像

CreateTable(
   "dbo.User",
   c => new 
   {
      Id = c.Long(nullable: false, identity: true),
      AdditionalPropertyNotForEF = c.String()
   }) ...

这是EF6实体类型发现过程的已知行为,在文档的类型发现部分中解释:

如果您的类型参与继承层次结构,则足以为基类定义DbSet属性,并且如果它们与基类同一组件,则将自动包含派生类型。<<<<<<<<<<<<<<<<<<

我同意这是违反直觉的行为(它已固定在EF核心中(,但事实就是这样。因此,要么不继承实体类型,要么使用[NotMapped]数据注释排除派生的非实体类型,或者Ignore Fluent API。

最新更新