EF4 + Poco = Проблема Обновление многих для многих отношений - PullRequest
1 голос
/ 01 февраля 2011

Позвольте мне объяснить весь контекст:

Я использую ASP.NET MVC 2, EF4 (POCO).

Я пытаюсь создать универсальный репозиторий для моего приложения.

У меня проблема с обновлением отношения многие ко многим .

У меня есть элемент, который связан с другими таблицей "многие ко многим",В представлении пользователь выбирает нужные категории и отправляет только выбранные идентификаторы в контроллер.

Затем контроллер запрашивает репозиторий категорий, добавляя его в основной элемент:

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 )) %>

Где CheckBoxList является HTMLHelper.

Я помещаю идентификаторы в качестве значений в View, потому что я не знаю другого способа поместить и затем получить эту информацию из View.

Как я могу использовать метод ObjectStateManager.ChangeRelationshipState?

Как это?:

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

Я пытаюсь таким образом, но он возвращает ошибку.

Помогите! LOL

1 Ответ

2 голосов
/ 01 февраля 2011

У вас есть несколько проблем.

1) ApplyCurrentValues работает только для scalar-properties . Поскольку вы пытаетесь добавить Category к навигационному свойству Categories на Item, это не будет работать.

2) Вы говорите это:

пользователь выбирает нужные категории и отправляет только выбранные идентификаторы на контроллер.

Как ваш контроллер может принимать несколько идентификаторов? Как выполняется привязка этой модели? Нам нужно больше информации о том, как ваш View связан с вашей моделью, что передается в метод действия. Но, похоже, вам нужно перепроектировать этот конкретный вид с помощью ViewModel.

3) Отслеживание изменений с помощью POCO в MVC - королевская боль в заднице. В вашем сценарии вам нужно будет использовать 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();
}
...