C# 实体框架核心:从未调用属性设置器(违反封装?)

C# 实体框架核心:从未调用属性设置器(违反封装?),c#,entity-framework-6,entity-framework-core,C#,Entity Framework 6,Entity Framework Core,在EF Core和EF6中,调用属性“Date”(见下文)的getter会给出正确的值,但是请注意两者之间的细微差别:在EF Core中,永远不会调用setter 这是我的模型: public class MyModel { private DateTime _Date; private bool dateTimeHasBeenSet = false; public DateTime Date { get {

在EF Core和EF6中,调用属性“Date”(见下文)的getter会给出正确的值,但是请注意两者之间的细微差别:在EF Core中,永远不会调用setter

这是我的模型:

public class MyModel
{      
    private DateTime _Date;
    private bool dateTimeHasBeenSet = false;
    public DateTime Date
    {
        get
        {
            return _Date;
        }
        set
        {
            dateTimeHasBeenSet = true;
            _Date = value;
        }
    }
}
这是我检索单个项目的方法:

        //Entity Framework 6
        using (Ef6Context context = new Ef6Context())
        {

            var m =  context.MyModels.First();

            // m.dateTimeHasBeenSet is true

        }

        //Entity Framework Core
        using (EfCoreContext context = new EfCoreContext())
        {

            var m = context.MyModels.First();
            // m.dateTimeHasBeenSet is false
        }
EF core是否初始化备份字段而不是属性(通过反射)?这不违反封装吗

我正在将一些代码从EF6迁移到EF Core,我真的希望避免浪费时间手动调用每个setter后面的逻辑


编辑:问这个问题让我尝试了一些奇特的方法,如果我将备份字段从_Property重命名为_PropertyX(在本例中是_DateX)之类的任何东西,我的setter会被EF Core神奇地调用

对于EF Core,我们有一个支持字段的概念:

支持字段允许EF读取和/或写入字段而不是属性

当EF按照约定为您的属性显示支持字段时,它将在实体化时使用该字段而不是您的属性。只有在实体物化之后,如果EF需要更新实体,它才会在可能的情况下使用该属性(当该属性不是只读时),否则它将继续使用您的支持字段

通过执行以下代码,您可以告诉EF Core在具体化实体时始终使用您的属性(仅适用于Fluent API):


感谢您解释该行为以及如何禁用它,有没有一种方法可以在全球范围内禁用它?我正在迁移80个表*20个列,这甚至不是我的代码…@Akli我更新了我的答案,了解如何在整个模型中全局应用它:)
modelBuilder.Entity<MyModel>()
    .Property(b => b.Date)
    .HasField("_Date")
    .UsePropertyAccessMode(PropertyAccessMode.Property);
modelBuilder.UsePropertyAccessMode(PropertyAccessMode.Property);