2 回答

TA貢獻1794條經驗 獲得超8個贊
問題是默認的EF Core屬性訪問方式導致的,ToList()調用這里
public IEnumerable<CaseWorkNote> WorkNotes => _workNotes?.ToList();
不確定您遵循的是哪種類型的方法,但您違反了簡單的良好設計規則,即屬性(尤其是集合類型)不應在每次獲取時分配。不僅因為它效率低下,而且還允許像 EF Core 這樣的“智能”客戶端檢測實際類型,并在加載相關數據List時嘗試使用它來添加項目。
實際上,對于這種類型的實現,他們正在添加到一個被丟棄的列表中,換句話說——無處可去。因此 EF Core 加載相關數據/導航屬性修復不起作用,這也可能影響更改跟蹤器并導致奇怪的行為。
要解決 EF Core 問題,您應該將 EF Core 配置為直接使用支持字段。最簡單的方法是在覆蓋內全局設置它OnModelCreating:
modelBuilder.UsePropertyAccessMode(PropertyAccessMode.Field);
它也可以針對每個實體或每個實體屬性進行設置,但我會建議以上內容,而且 EF Core 3.0 中的預期變化之一是默認使用支持字段。
不管怎樣,現在問題就解決了。
不過,最好遵循良好做法。該_workNotes成員應使用初始化程序或在類構造函數中進行初始化,屬性獲取器應直接返回它。如果想法是阻止調用者通過強制轉換結果來訪問私有成員,那么還有其他方法可以阻止不克隆集合內容的方法。例如:
//Aggregated entity
private readonly HashSet<CaseWorkNote> _workNotes = new HashSet<CaseWorkNote>();
public IEnumerable<CaseWorkNote> WorkNotes => _workNotes.Select(e => e);
//
無論是否保留導航屬性的當前實現,都必須讓EF Core 直接使用支持字段。

TA貢獻1884條經驗 獲得超4個贊
添加外鍵屬性CaseId。還添加了Virtual關鍵字。
public class CaseWorkNote : FullAuditedEntity
{
[ForeignKey("CaseId")]
[Required]
public virtual Case Case { get; private set; }
public virtual Guid CaseId { get; private set; } /* Added */
[Required]
public virtual string Text { get; set; }
private CaseWorkNote() : base() { }
public static CaseWorkNote Create(Case kase, string text)
{
return new CaseWorkNote()
{
Case = kase,
Text = text
};
}
}
- 2 回答
- 0 關注
- 239 瀏覽
添加回答
舉報