在一个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。