2011-10-06 85 views
1

我使用MVC.net,我有2類(案件和事故)與多對多的關係,我也使用自動映射器複製視圖模型到EF,反之亦然。現在我遇到的問題是當我這樣做:MVC.net EF保存Automapper查看模型不更新鏈接對象

Case theCase = Mapper.Map<CaseEditVM, Case>(theCaseEditVM); 
theCase.Accidents.Clear(); 
UOW.Cases.Update(theCase); 

保存事件的變化,但事故的鏈接表不是。如果完全忽略事故更改。

但是當我這樣做:

Case theCase = UOW.Cases.GetByID(someid).Include("Accidents"); 
theCase.accidents.Clear(); 
UOW.Cases.Update(theCase); 

EF正確保存事故性質。

因此,從我可以告訴EF忽略事故屬性,因爲它沒有映射內部EF呢。但是,如何在繪製View模型時告訴它我想讓EF更新鏈接屬性?

回答

0

您的案例中最簡單的方法是首先將案件附加到上下文並在您將其附加後清除更改。否則,您將擁有a lot of work。沒有什麼魔法可以爲你做到這一點。 EF不知道關於您對分離實體所做的關係所做的更改,甚至更糟糕的是,一旦將實體附加到上下文,您已經不知道導航屬性中包含了哪些記錄,因此您無法配置上下文以反映它(它必須按照每一個相關的實體來完成),而無需重新加載整個實體並在分離和附加實體之間合併變化。

+0

我試過dbSet.Attach(entityToUpdate); entityToUpdate.Accidents.Clear(); context.Entry(entityToUpdate).State = EntityState.Modified;但它不會清除列表。我可以使它工作的唯一方法是使用「包含」加載案例,然後進行更改。然而,EF引發這個異常「ObjectStateManager中已存在一個具有相同鍵的對象」,如果我加載該案例,然後自動將新的值映射到它。 – Jammy

+0

我正在使用的Scratch Case theCase = UOW.Cases.GetByID(theCaseEditVM.ID); theCase = Mapper.Map (theCaseEditVM);這給了錯誤,但只是注意到,如果我這樣Case theCase = UOW.Cases.GetByID(theCaseEditVM.ID); Mapper.Map (theCaseEditVM,theCase); EF很高興並且複製了這些更改。哇噢。 TNX – Jammy