簡體   English   中英

帶有 Cosmos 的 EF Core 5.0 - 新屬性和支持字段

[英]EF Core 5.0 with Cosmos - New properties and backing fields

我正在使用 EF Core 5.0 和 Cosmos,我正在嘗試解決如何處理可能將新屬性添加到 model 的情況,但舊文檔沒有此新屬性。 例如,如果原始 model 看起來像:

{
   public int Id { get; set; }
   public string Title { get; set; }
}

...然后一段時間后添加了一個新屬性...

{
   public int Id { get; set; }
   public string Title { get; set; }
   public bool IsEnabled { get; set; }
}

...然后,當我嘗試檢索僅具有原始屬性的文檔時遇到問題(我收到“不可為空的字段必須具有值”錯誤)。 如果我將數據類型更改為bool? ,它有效......這是可以理解的。 但是我試圖避免使用可空類型,因為我需要添加額外的代碼來檢查空值等。

我嘗試使用“支持字段”來使其正常工作,如下所示:

{
   public int Id { get; set; }
   public string Title { get; set; }
   
   private bool? _isEnabled { get; set; }
   public bool IsEnabled { 
      get => _isEnabled ?? false; 
      set => _isEnabled = value; 
   }
}

...然后在 model 構建器中使用 Fluent API,如下所示:

   modelBuilder.Entity<MyEntity>()
      .Property(m => m.IsEnabled)
      .HasField("_isEnabled")
      .UsePropertyAccessMode(PropertyAccessMode.Field);

但這會為我生成以下錯誤:

System.InvalidOperationException:找不到屬性“MyEntity.IsEnabled”的指定字段“_isEnabled”

我究竟做錯了什么? 由於文檔中不存在IsEnabled屬性,這永遠不會起作用嗎?

更新:這個問題實際上是關於如何使用 EF Core 和 Cosmos 處理“模式”更改的問題。 我知道 NoSql 是“無模式”的,但現實情況是數據模型會隨着時間而變化,並且由於 EF Core 遷移不適用於 Cosmos,那么處理這個問題的最佳方法是什么?

我認為,字段_isEnabled必須是public

文檔提到,如果您選擇PropertyAccessMode.Field ,如果無法讀取或寫入該字段,則會引發異常。

您在上面所做的應該可以正常工作。 我在某些情況下做了類似的事情,而且效果很好。 (英法 6)

EF6 甚至可以推斷支持字段,因此您的綁定只需

modelBuilder.Entity<MyEntity>().Property(m => m.IsEnabled)

只有當無法推斷支持字段時,您才需要手動定義支持字段(我猜這是他們在 EF6 中修復的內容)

當文檔中不存在IsEnabled字段時,為什么要使用false值填充它?

考慮一種情況,其中文檔具有實際IsEnabled = false的字段和人為具有IsEnabled = false的文檔,您將如何區分它們 添加另一個字段?

相同的問題將適用於具有不同數據類型的其他屬性。

這種方法在我看來是錯誤的。 而不是這個,如果你真的不想使用可為空的屬性,你可以為你的模型使用版本控制

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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