开发者

EF4 + Poco = Problem Updating many to many relationships

Let me explain the whole context:

I'm using ASP.NET MVC 2, EF4 (POCO).

I trying to do a generic repository for my app.

I'm having problem on updating a many to many relationship.

I have an item that is related to other by a many to many table. In the View, the user picks the desired Categories, and send just the chosen id's to the Controller.

Then, the Controller queries the Category Repository, adding it to the main item:

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

But, when I go the Repository and try to save like this:

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

But, the state of my entity is Added.

Then, I Cannot save my entity :(.

How can I solve this problem?


Thanks for your answers.

I have in the View, the following code:

 <%= 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.

Im putting the ids as values in the View, because I dont know other way to put and then get this information from the View.

How can I use the ObjectStateManager.ChangeRelationshipState method?

Like this? :

itemRepository.Db.ObjectStateManager.ChangeRelationshipState(item, item.Categories, "Categories", System.Data.EntityState.Modified);
开发者_JAVA技巧

I trying in this way, but it returns error.

Help! lol


You've got a few problems.

1) ApplyCurrentValues only works for scalar-properties. Since your trying to add a Category to the Categories navigational property on Item, this will not work.

2) You say this:

the user picks the desired Categories, and send just the chosen id's to the Controller.

How can your Controller accept a bunch of id's? How is this model binding done? We need more info on how your View is bound to your model, what's being passed to the action method. But it sounds like you need to redesign this particular View with the help of a ViewModel.

3) Change tracking with POCO's in MVC is a royal pain in the butt. In your scenario, you'll need to use ObjectStateManager.ChangeRelationshipState to manually set the Categories relationship to **Modified.

Honesty though, it's more pain than it's worth. I went through this same problem.

Cop it on the chin - go grab the entity first and use 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();
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜