使EF酷睿2与getter唯一的财产没有工作支持字段

时间:2019-01-30 15:35:21

标签: c# entity-framework .net-core entity-framework-core

我的目标是使用以下代码使Entity Framework 2变得更好玩:

public class Foo
{
    public Guid Id { get; } // This should NOT change

    public string NotRequiredProperty {get; set;}

    public Foo(Guid id) => Id = id;

    private Foo() { } // Empty constructor is necessary for EF Core I believe?
}

我已阅读this blog post,该书指出可以完成以下操作:

// Class
private Guid _id;
public Guid Id => _id;

// Configuration
modelBuilder.Entity<Foo>()
.Property(b => b.Id)
.UsePropertyAccessMode(PropertyAccessMode.FieldDuringConstruction);

可以的。

我在这里看到的唯一改进是,即使{ get; }意味着隐式创建一个私有后备字段,我也必须显式声明一个私有后备字段。

如何使EF Core仅使用{ get; }(当然还有一些必需的实体配置)

1 个答案:

答案 0 :(得分:1)

使用EF Core 2.1引入的Entity types with constructors with parameters功能,通常可以。您不再需要空的构造函数-EF Core将能够使用带有Guid id参数的构造函数。

但是,您的Id属性有两个限制。首先,它是一个只读属性(因此由readonly字段支持,该字段只能从构造函数中进行设置)。如果您将其定义为private readonly Guid _id;,则在显式后备字段示例中的等效项将是。然后,示例配置将无法正常工作。

Read-only properties的文档部分说:

  

一旦通过构造函数设置了属性,就可以将其中的某些属性设置为只读。 EF Core支持此功能,但有一些注意事项:

     
      
  • 没有setter的属性不是按约定映射的。 (这样做往往会映射不应映射的属性,例如计算后的属性。)
  •   
  • 使用自动生成的键值需要具有可读写的键属性,因为在插入新实体时,键生成器需要设置键值。
  •   

请注意第二个项目符号,因为这是第二个问题。约定Id属性是一个PK,约定约定Guid和数字类型PK是自动生成的

因此,您需要在两个选项之间进行选择-通过按照链接中的建议添加Id来使private set; 为非只读,或者(这是答案问题“如何使EF Core只需使用{ get; }),就可以使用以下流利的配置使其成为非自动生成的

modelBuilder.Entity<Foo>()
    .Property(e => e.Id)
    .ValueGeneratedNever();