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; }
(当然还有一些必需的实体配置)
您所问的问题通常可以通过 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)