使EF Core 2与仅具有吸气剂的属性一起使用,而没有支持字段 - c#

我的目标是使用以下代码使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; }一起使用(当然还有一些必需的实体配置)

参考方案

使用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();

45码