簡體   English   中英

使 EF Core 2 僅使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM