[英]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.