实体框架迁移添加了子类

时间:2018-03-25 12:41:59

标签: c# entity-framework-6

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

创建迁移代码时
  

add-migration 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-migration创建的Migration类看起来像

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

1 个答案:

答案 0 :(得分:2)

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

  

如果您的类型参与继承层次结构,则为基类定义DbSet属性就足够了,而派生类型将自动包含在内,如果它们与基类。

我同意这是违反直觉的行为(已在EF Core中修复),但事实就是如此。因此要么不继承实体类型,要么使用[NotMapped]数据注释或Ignore流畅的API排除派生的非实体类型。

相关问题