2011-05-03 177 views
1

我以幾種不同的方式提出了幾個不同的問題,但我還沒有收到任何回覆。我再次嘗試,因爲我覺得我的解決方案過於複雜,我必須錯過簡單的事情。更新多對多關係

在MVC 3應用程序中使用EF 4.1,POCO,DbContext API,AutoMapper和Razor。

我有兩個我的實體之間有多對多的關係:Proposals和CategoryTags。我可以成功將提案(Automapper)映射到我的ProposalViewModel,包括CategoryTag的集合。

在我的視圖中,我使用javascript來允許用戶通過動態創建元素來添加,更新和移除標籤,每個元素存儲所選標籤的ID。

我可以成功地將我的ViewModel發佈回我的控制器,它的CategoryTags集合已填充(儘管只與每個CategoryTag的ID屬性一起)。

當ViewModel重新發布到我的控制器時,我不知道如何從ViewModel獲取這些標記並將它們添加到我的模型中,以便db.SaveChanges()正確更新數據庫。

唯一辦法我已經沒有成功是斷開的映射分類|標籤集合(由不同納米格他們),通過每個標籤遍歷並手動在我的背景下看它,然後調用。新增( ) 方法。由於種種原因,這很sl which,導致我認爲我做錯了。

任何人都可以提供任何方向嗎?

UPDATE:

對於任何人誰是有興趣的,我的功能代碼:

  Dim p As New Proposal 
      Dim tempTag As CategoryTag 
      p = AutoMapper.Mapper.Map(Of ProposalViewModel, Proposal)(pvm) 

      db.Proposals.Attach(p) 
      db.Entry(p).Collection("CategoryTags").Load() 

      For Each ct In pvm.Tags 
       tempTag = db.CategoryTags.Find(ct.Id) 

       If tempTag Is Nothing Then 
        Continue For 
       End If 

       If ct.Tag = "removeMe" Then 
        p.CategoryTags.Remove(tempTag) 
        Continue For 
       End If 

       p.CategoryTags.Add(tempTag) 
      Next 


      db.Entry(p).State = EntityState.Modified 
      db.SaveChanges() 
      Return RedirectToAction("Index") 

回答

4

唯一的工作方式是手工做這個 - 你可以閱讀full description of the problem如果你想。描述與ObjectContext API相關,但DbContext API只是包裝器遭遇相同的問題(實際上DbContext API在此場景中遇到更多問題,因此我將跳過手動設置關係的解決方案)。

總之。將數據發回控制器後,您必須創建新的上下文實例並附上您的Proposal和相關CategoryTags。但在此之後,您必須告知您所做更改的背景。這意味着您必須說明上下文哪些標籤已添加到提案中,哪些已被刪除。否則上下文無法處理您的更改,因爲它不會自動合併數據庫中的數據。

解決此問題的最簡單方法是從數據庫(=您將附加實例)加載當前Proposal與相關CategoryTags,並將傳入數據合併到附加對象圖中。這意味着您將根據發佈的值手動刪除和添加標籤。

+0

Ladislav,Thak你,這是我需要聽到的不幸答案。如果這是唯一的方法,那麼,我會期待EF 4.2解決這個問題.. :) – 2011-05-03 20:50:00

+0

我回答了類似的問題20+次,之後我不得不說,這可能不會有任何自動解決方案問題。如果你有分離的實體,你必須以某種方式說EF你做了什麼。它是一樣的,如果你想插入,更新,手動刪除。你必須知道什麼被刪除和插入了什麼。 – 2011-05-03 22:41:06

+0

我認爲這是有道理的,如果EF有某種「自動調節器」,至少試圖根據您的分離實體與當前實體之間的差異來計算出來,那將會很好。 對不起,您必須回答這麼多次,我很難找到有關此主題的確認答案。 – 2011-05-04 15:13:07