gpt4 book ai didi

c# - 使 EF Core 2 使用仅 getter 属性,无需支持字段

转载 作者:行者123 更新时间:2023-12-02 03:36:46 26 4
gpt4 key购买 nike

我的目标是让 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; ,我也需要显式声明一个私有(private)支持字段。 } 表示隐式创建。

如何让 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 的文档部分说:

Once properties are being set via the constructor it can make sense to make some of them read-only. EF Core supports this, but there are some things to look out for:

  • Properties without setters are not mapped by convention. (Doing so tends to map properties that should not be mapped, such as computed properties.)
  • Using automatically generated key values requires a key property that is read-write, since the key value needs to be set by the key generator when inserting new entities.

请注意第二个项目符号,因为这是第二个问题。按照惯例,Id 属性是一个 PK,而 Guid 和数字类型 PK 按照惯例是自动生成

因此,您需要在两个选项之间进行选择 - 要么通过添加 private set; 来使 Id 非只读,如链接,或者(这是问题“如何让 EF Core 仅使用 { get; }”的答案)使其非自动使用以下流畅配置生成:

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

关于c# - 使 EF Core 2 使用仅 getter 属性,无需支持字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54444174/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com