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