簡體   English   中英

更新實體框架中的多級屬性

[英]Updating multiple level properties in Entity Framework

我有一個具有多級屬性的實體結構,每個頭表條目都有多個子表條目,並且關系經過多個級別。 表圖如下所示:

在此處輸入圖片說明

我需要獲取與 ECNEntries 表中一個條目相關的所有數據以顯示在網格中。 用戶可以在各個級別編輯條目、刪除一些條目、添加更多條目。

我可以像這樣獲取特定條目的所有數據:

var ECNEntryInDb = ECNEntriesRepo.FindAll(f => f.ECNStages
                                .Select(i => i.ECNComponentDetails
                                    .Select(j => j.ECNMaterialReferenceDetails
                                        .Select(k => k.ECNComponentDetails))))
                                        .Where(x => x.Id == ECNEntriesData.Id).FirstOrDefault();

但是我找不到將這些數據更新回數據庫的方法。

當我這樣嘗試時:

var xx = Mapper.Map<DAL.Entities.ECNEntries>(ECNEntriesData);
ECNEntriesRepo.Update(xx);

我得到一個例外:

附加類型為“ProductionControl.DAL.Entities.ECNEntries”的實體失敗,因為相同類型的另一個實體已具有相同的主鍵值。 如果圖中的任何實體具有沖突的鍵值,則在使用“Attach”方法或將實體狀態設置為“Unchanged”或“Modified”時可能會發生這種情況。 這可能是因為某些實體是新的,尚未收到數據庫生成的鍵值。 在這種情況下,使用“添加”方法或“添加”實體狀態來跟蹤圖形,然后根據需要將非新實體的狀態設置為“未更改”或“已修改”。

當我嘗試這樣做時:

var ECNEntryInDb = ECNEntriesRepo.FindAll(f => f.ECNStages
                                    .Select(i => i.ECNComponentDetails
                                        .Select(j => j.ECNMaterialReferenceDetails
                                            .Select(k => k.ECNComponentDetails)))).Where(x => x.Id == ECNEntriesData.Id).FirstOrDefault();
                                //var ECNEntryInDb = ECNEntriesRepo.FindById(ECNEntriesData.Id);

Mapper.Map<BL.DTO.ECN.ECNEntries, DAL.Entities.ECNEntries>(ECNEntriesData, ECNEntryInDb);
ECNEntriesRepo.Update(ECNEntryInDb);

這就是我得到的:

操作失敗:無法更改關系,因為一個或多個外鍵屬性不可為空。 當對關系進行更改時,相關的外鍵屬性將設置為空值。 如果外鍵不支持空值,則必須定義新關系,必須為外鍵屬性分配另一個非空值,或者必須刪除不相關的對象。

我嘗試了此頁面中建議的一些解決方案,例如添加復合鍵等等。 它也沒有用。 給出一個例外,如:

不允許添加與處於已刪除狀態的實體的關系

這是示例數據結構:

 "EcnEntries": [ { "Id": 49, "ECNHeaderId": 11, "ECNVersionId": 8, "ECNVersion": null, "ECNPartNumber": "280384-01/01M", "ECNStages": [ { "Id": 25, "ECNEntriesId": 49, "OperationNo": "006", "WorkCenterId": 198, "ChangesRequired": "asxa", "ReasonForChanges": "erte", "ECNComponentDetails": [ { "Id": 31, "ECNStagesId": 25, "CurrentBOMPartNumber": "jhjhk", "ReplacementComponentPartnumber": "uyuyuy", "ECNMaterialReferenceDetails": [ { "Id": 38, "ECNComponentDetailsId": 31, "MaterialReferenceNumber": "323" }, { "Id": 39, "ECNComponentDetailsId": 31, "MaterialReferenceNumber": "12" } ] } ] } ] } ]

編輯

這就是存儲庫實現中的 Update 函數所做的。 如何更改引用子表對象的狀態?

public void Update(T entity)
        {
            contextFactory.GetDataContext().Entry(entity).State = EntityState.Modified;
        }

誰能建議一種方法來更新這些數據? 我是否需要遍歷每個孩子並更新數據? 在這種情況下,我也很困惑如何同時迭代來自 UI 的數據和來自數據庫的實體以應用更改。 我不確定我是否搞砸了一些非常簡單的事情。

提前致謝。

正如@jdweng 所說,問題出在 Automapper 上。 發現這個鏈接很有用。

自動映射器正在替換引用子表對象,最終將引用設置為 null。 它觸發了錯誤。

暫無
暫無

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

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