在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()
}) ...
答案 0 :(得分:2)
这是EF6实体类型发现过程的已知行为,在文档的Type Discovery部分进行了解释:
如果您的类型参与继承层次结构,则为基类定义
DbSet
属性就足够了,而派生类型将自动包含在内,如果它们与基类。
我同意这是违反直觉的行为(已在EF Core中修复),但事实就是如此。因此要么不继承实体类型,要么使用[NotMapped]
数据注释或Ignore
流畅的API排除派生的非实体类型。