具有私有setter的EFCore Base实体模型属性 - 迁移奇异行为

时间:2016-12-21 14:47:15

标签: c# entity-framework-core

实体模型继承的类中的私有setter似乎导致EFCore迁移的奇怪问题。请考虑以下示例,其中有多个类(BarBaz)继承自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

的类

1 个答案:

答案 0 :(得分:1)

EF核心工具只会在特定条件下映射私有的基类设置器。

例如,如果您有builder.Entity<Bar>().HasAlternateKey(x => x.Created);,则EF工具会映射Created属性,无论其是否具有私有或公共设置器。