使 EF Core 2 仅使用 getter 属性而无需支持字段

S. *_*nke 5 c# entity-framework entity-framework-core .net-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?
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了这篇博客文章,它说可以做到以下几点:

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

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

Run Code Online (Sandbox Code Playgroud)

这可以工作。

我在这里看到的唯一改进是我需要明确声明一个私有支持字段,即使一个{ get; }意味着一个是隐式创建的。

我怎样才能让 EF Core 与 JUST a 一起工作{ get; }(当然还有一些必需的实体配置)

Iva*_*oev 5

您所问的问题通常可以通过 EF Core 2.1 引入的具有带参数功能的构造函数的实体类型来实现。您不再需要空构造函数 - EF Core 将能够使用带有Guid id参数的构造函数。

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

只读属性的文档部分说:

一旦通过构造函数设置了属性,就可以将其中一些设置为只读。EF Core 支持这一点,但有一些事情需要注意:

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

请注意第二个项目符号,因为这是第二个问题。按照惯例,属性Id是 PK,并且Guid按照惯例,数字类型 PK 是自动生成的

因此,您需要在两个选项之间进行选择 -通过按照链接中的建议进行添加来使其成为Id 非只读private set;,或者(这是问题“How can I make EF Core work with JUST a { get; })使其成为非自动- 使用以下流畅配置生成:

modelBuilder.Entity<Foo>()
    .Property(e => e.Id)
    .ValueGeneratedNever();
Run Code Online (Sandbox Code Playgroud)