亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

添加到聚合根時未保存子實體

添加到聚合根時未保存子實體

C#
智慧大石 2023-05-13 16:20:16
當我保存更改時,一切看起來都很好。CaseWorkNote 實體已正確創建并添加到 workNotes 集合(案例實體的屬性)。當 CurrentUnitOfWork 調用 DbContext->SaveChanges() 時,我看到我的實體在那里,狀態為已添加。最后什么都沒有保存到數據庫中。我在我的代碼中錯過了什么或者我做錯了什么?下面是我的代碼和帶有跟蹤實體的屏幕截圖。模型:    public class Case : FullAuditedAggregateRoot<Guid>    {        [Required]        public CaseType Type { get; set; }        [Required]        public string Subject { get; set; }        public string Descripion { get; set; }        //Aggregated entity        private HashSet<CaseWorkNote> _workNotes;        public IEnumerable<CaseWorkNote> WorkNotes => _workNotes?.ToList();        //        public CaseWorkNote AddNote(string text)        {            if (_workNotes is null)            {                _workNotes = new HashSet<CaseWorkNote>();            }            CaseWorkNote workNote = CaseWorkNote.Create(this, text);            _workNotes.Add(workNote);            return workNote;        }    }    public class CaseWorkNote : FullAuditedEntity    {        [ForeignKey("CaseId")]        [Required]        public Case Case { get; private set; }            [Required]        public string Text { get; set; }                    private CaseWorkNote() : base() { }        public static CaseWorkNote Create(Case kase, string text)        {            return new CaseWorkNote()            {                Case = kase,                Text = text            };        }    }
查看完整描述

2 回答

?
幕布斯7119047

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 直接使用支持字段。


查看完整回答
反對 回復 2023-05-13
?
慕村9548890

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

            };

        }

    }


查看完整回答
反對 回復 2023-05-13
  • 2 回答
  • 0 關注
  • 239 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號