[英]EF Core: No backing field could be found for property of entity type and the property does not have a 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.