实体模型继承的类中的私有setter似乎导致EFCore迁移的奇怪问题。请考虑以下示例,其中有多个类(Bar
和Baz
)继承自Foo
。多次运行Add-Migration
命令(添加/删除private
修饰符`)时,生成的模式在多种方面都是错误的。
Created
属性设置为已删除的列Created
属性设置为删除(并且不会替换/重命名)。我的理解是,EFCore工具并没有特别小心地使用私人制定者处理房产。这是一个错误的假设吗?如果是这样,为什么某些私有setter工作基类,而不是其他人?我假设这是EF Tools中的一个错误,可能与它如何处理属性命名有关,考虑到我在模型中有其他类似名称的属性可能会混淆工具
public class Context : DbContext
{
public DbSet<Bar> Bars { get; set; }
public DbSet<Baz> Bazs { get; set; }
}
public class Bar : Foo { }
public class Baz : Foo { }
public abstract class Foo
{
protected Foo()
{
Created = DateTimeOffset.UtcNow;
}
public DateTimeOffset? Created { get; private set; }
public DateTimeOffset? Updated { get; set; }
}
编辑 - &gt;似乎DateTimeOffset的私有setter导致EF Tools永远不会在基类中映射它们。但是,我有一个字符串属性,其中包含[Required]
和[StringLength]
属性的私有设置器,以及builder.Entity<Foo>().HasAlternateKey(x => x.RequiredStringProperty);
在这种情况下,EF绝对映射属性...但仅限于某些属性继承自Foo
。
答案 0 :(得分:1)
EF核心工具只会在特定条件下映射私有的基类设置器。
例如,如果您有builder.Entity<Bar>().HasAlternateKey(x => x.Created);
,则EF工具会映射Created
属性,无论其是否具有私有或公共设置器。