2014-02-20 57 views
0

我在EF中有一個存儲庫,需要更新分離的實體,但存在於ObjectStateManager中的存儲庫。想象一下,您已經在DBContext上打開了一個會話,在該會話中加載了一個特定的實體,但是隨後您會收到一個從分離版本的對象中更新的請求。我發現這樣做的唯一方法是在狀態管理器中逐個獲取現有對象,然後逐個更新字段到傳入對象的字段。然後將對象狀態管理器版本的狀態設置爲已修改,並保存上下文。使用多對多映射更新分離的EF對象

這適用於不包含導航屬性的簡單實體。

我現在正試圖在一個具有多對多關係的實體上這樣做。

想象一下你有一個BlogPost對象和一個Hashtag對象。這是一個多對多的關係。我已經定義了這一點,並且在數據庫中我可以看到我有三個表格,BlogPost,HashTag和映射表。

我想要做的就是編輯前端的博客文章,傳遞更新的博客文章及其新的應用於它的主題標籤列表,並更新數據庫。

問題是標籤列表可能與舊標籤完全無關,所以我首先必須清除所有以前的映射,然後添加新的標籤。如果它們是相同的,這將是必要的冗餘,但實現它的唯一途徑。

我無法弄清楚如何在多對多關係中清除以前的映射。我曾嘗試

foreach (var tag in dbBlogPost.Hashtags) 
    dbItem.Hashtags.Remove(tag); 

我然後添加新的主題標籤爲空集,然後做

​​

但是當我保存的資料庫,我得到下面的異常

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

任何人都可以建議我做錯了什麼?

回答

0

DbSet<TEntity>.Local表示該集合中所有已添加,未更改和已修改實體的本地視圖。所以你可以在做任何改變之前清除所有的集合。

dbBlogPost.Hashtags.Local.Clear();