C# 带有私有setter的EFCore基本实体模型属性-迁移奇怪的行为

C# 带有私有setter的EFCore基本实体模型属性-迁移奇怪的行为,c#,entity-framework-core,C#,Entity Framework Core,实体模型继承的类中的私有setter似乎会导致EFCore迁移出现奇怪的问题。请考虑下面的示例,其中有多个类( bar >代码> Baz >,该代码继承自 fo。多次运行addmigration命令(添加/删除private修饰符`)时,生成的模式在多个方面都是错误的 有时创建的属性设置为删除的列 有时,所有创建的属性都设置为删除(而不是替换/重命名为任何内容) 我的理解是,EFCore工具并没有特别小心地对待私有setter的属性。这是一个错误的假设吗?如果是这样的话,为什么一些私有s

实体模型继承的类中的私有setter似乎会导致EFCore迁移出现奇怪的问题。请考虑下面的示例,其中有多个类(<代码> bar <代码> >代码> Baz <代码> >,该代码继承自<代码> fo。多次运行
addmigration
命令(添加/删除
private
修饰符`)时,生成的模式在多个方面都是错误的

  • 有时创建的
    属性设置为删除的列
  • 有时,所有创建的属性都设置为删除(而不是替换/重命名为任何内容)
我的理解是,EFCore工具并没有特别小心地对待私有setter的属性。这是一个错误的假设吗?如果是这样的话,为什么一些私有setter在基类上工作,而不是在其他基类上工作?我假设这是EF工具中的一个bug,可能与它如何处理属性命名有关,因为我在模型中有其他具有类似名称的属性,这可能会混淆工具

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; }
}
公共类上下文:DbContext
{
公共DbSet条{get;set;}
公共DbSet Bazs{get;set;}
}
公共类栏:Foo{}
公共类Baz:Foo{}
公共抽象类Foo
{
受保护的Foo()
{
Created=DateTimeOffset.UtcNow;
}
公共DateTimeOffset?已创建{get;private set;}
公共DateTimeOffset?已更新{get;set;}
}

编辑->似乎DateTimeOffset的私有设置器导致EF工具从不在基类中映射它们。但是,我有一个带有私有setter的string属性,该setter具有
[Required]
[StringLength]
属性,以及
builder.Entity().hasaAlternateKey(x=>x.RequiredStringProperty)
在这种情况下,EF绝对映射属性…但仅使用从
Foo

继承的某些类,EF核心工具仅在特定条件下映射基类的私有setter


例如,如果您有
builder.Entity().hasaAlternateKey(x=>x.Created)
,则EF工具将映射创建的
属性,无论该属性是否具有私有或公共setter。

我找不到
私有
setter工作时的情况。也找不到说明这一点的文档,但看起来没有设置器或带有私有设置器的属性在默认情况下被视为未映射。@IvanStoev它们有时确实被映射。我刚刚运行了另一个迁移测试,除了添加了
builder.Entity().hasaAlternateKey(x=>x.Created)
在我的项目中,一个
想要删除创建的列,但不是
Baz
。更具体地说,执行此操作的属性是一个具有
[Required]
[StringLength]
属性的字符串。如果您有
builder.Entity()。这就是为什么我在第一次评论中默认这么说。基本上,任何对属性的流畅访问器(当然,除了
忽略
)都会导致它被映射,而不管私有setter是什么。坦率地说,我会避免使用私有setter(受保护的setter和内部setter没有这种默认行为)。顺便说一句,我认为这不是工具行为,而是EF基础设施默认映射。