繁体   English   中英

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

[英]Make EF Core 2 work with a getter only property without a backing field

我的目标是使用以下代码使 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?
}

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

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

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

这可以工作。

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

我怎样才能让 EF Core 只使用一个{ get; } { get; } (当然需要一些实体配置的)

你所问的是可能的,一般与EF核心2.1引入 实体类型与构造带参数的功能。 您不再需要空构造函数 - EF Core 将能够使用带有Guid id参数的构造函数。

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

只读属性的文档部分说:

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

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

注意第二个要点,因为这是第二个问题。 按照惯例, Id属性是一个 PK,按照惯例, Guid和数字类型 PK 是自动生成的

因此,您需要在两个选项之间进行选择 - 通过添加private set;使Id非只读private set; 正如链接中所建议的那样,或者(这是问题“如何使 EF Core 与 JUST a { get; }一起工作”的答案)通过使用以下流畅的配置使其非自动生成

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM