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