1

讓我解釋一下整個背景:EF4 +波科=問題更新多對多關係

我使用ASP.NET MVC 2,EF4(POCO)。

我想爲我的應用程序做一個通用存儲庫

我在更新多對多關係有問題。

我有一個與其他許多表有關的項目。在視圖中,用戶選擇所需的類別,並將所選的ID發送到控制器。

然後,控制器詢問類別庫,將其添加到主項:

item.Categories.Add(CategoriesRepository.Single(id); 

但是,當我去了倉庫,並試圖挽救這樣的:

Entities.ApplyCurrentValues(entity); 
Context.SaveChanges(); 

但是,我的實體的狀態是增加了

然後,我無法保存我的實體:(。

我該如何解決這個問題呢?


謝謝您的回答。

我在視圖,下面的代碼:

<%= Html.CheckBoxList("Categories", ((IEnumerable<Categories>)ViewData["Categories"]).ToDictionary(c => c.ID.ToString(), c => c.Name) 
           , Model.Categories.ToDictionary(c => c.ID.ToString(),c => c.Name)) %> 

Where CheckBoxList is a HTMLHelper。

我把視圖中的ID作爲值,因爲我不知道其他方式放置,然後從視圖中獲取此信息。

如何使用ObjectStateManager.ChangeRelationshipState方法?

是否這樣? :

itemRepository.Db.ObjectStateManager.ChangeRelationshipState(item, item.Categories, "Categories", System.Data.EntityState.Modified); 

我以這種方式嘗試,但它返回錯誤。

幫助!大聲笑

+0

可能重複[更新關係節約EF4 POCO的對象發生變化時(http://stackoverflow.com/questions/ 3635071/update-relationships-when-saving-changes-of-ef4-poco-objects) – 2011-02-01 06:18:35

回答

2

你有幾個問題。

1)ApplyCurrentValues只適用於scalar-properties。由於您試圖將Category添加到ItemCategories導航屬性中,因此這不起作用。

2)你這樣說:

用戶挑選所需的類別,只發送所選擇的ID的控制器。

你的Controller如何接受一堆ID?這個模型綁定是如何完成的?我們需要更多關於您的View如何綁定到您的模型的信息,以及傳遞給操作方法的信息。但是這聽起來像你需要在ViewModel的幫助下重新設計這個特定的View。

3)在MVC中使用POCO進行跟蹤變化是一個令人royal目的事。在您的方案中,您需要使用ObjectStateManager.ChangeRelationshipState手動將Categories關係設置爲**修改。

誠實雖然,它比它的價值更痛苦。我經歷了同樣的問題。

警察它的下巴 - 先走搶實體和使用Controller.UpdateModel

[HttpPost] 
public ActionResult Item(Item item) 
{ 
    // get the existing item 
    var existingItem = ItemRepository.Single(item.Id); 

    // use MVC to update the model, including navigational properties 
    UpdateModel(existingItem); 

    // save changes. 
    Context.SaveChanges(); 
}