ASP.NET MVC3 Родительско-дочерние отношения и Entity Framework, как обновить дочерние? - PullRequest
2 голосов
/ 19 мая 2011

У меня есть приложение ASP.NET MVC 3, использующее Entity Framework 4 для обработки доступа к данным.

Структура объекта My View Model выглядит следующим образом:

public class OrderViewModel 
{
  public int Id { get; set; }
/* ... */
  public List<OrderLineItemViewModel> LineItems { get; set; }
}

public class OrderLineItemViewModel 
{
  public int Id { get; set; }
  public string Name { get; set; }
}

И моя модель Entity Framework выглядит следующим образом:

public class Order 
{
  public int Id { get; set; }
/* ... */
  public List<OrderLineItem> LineItems { get; set; }
}

public class OrderLineItem
{
  public int Id { get; set; }
  public string Name { get; set; }
}

То, с чем я борюсь, это как редактировать существующий ордер. Моя функция контроллера преобразует модель родительского представления в объект Order, а также преобразует дочерние элементы (OrderLineItemViewModel) в модель объектов (OrderLineItem). Однако после присоединения объекта к ObjectContext он теряет состояние, в котором элементы строки были изменены, добавлены или удалены.

Все примеры, которые я обнаружил для адресов родительских / дочерних отношений, скорее всего, не предусматривают каскадных обновлений для детей, а предпочитают иметь отдельное действие контроллера и представление для обновления дочерней коллекции. Тем не менее, я пытаюсь, чтобы редактирование происходило как одна атомарная операция ... Когда пользователь нажимает «Изменить порядок», чтобы отправить изменения, я хочу обновить поля родительского элемента, а также обработать все новые / удаленные / измененные дочерние элементы. ..

Каков наилучший подход к обработке отслеживания изменений дочерних объектов в Entity Framework при преобразовании из модели представления?

Я попытался добавить IsNew, IsDirty и IsDeleted в ViewModel и Модель, затем вызвал соответствующую функцию для каждого дочернего элемента (Attach, Delete или Add), но я получаю ошибки при попытке добавить, что дочерний элемент уже существует в ObjectStateManager в состоянии UnChanged ...

Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 мая 2011

Вы действительно должны как-то сообщить EF, что изменилось, что добавлено и что удалено.Существует два подхода:

  • Создайте Order и OrderLines из моделей представлений и Attach экземпляр Order в контексте.После этого вы должны изменить состояние каждой сущности (context.ObjectStateManager.ChangeObjectState).
  • Сначала загрузите все Order с OrderLines из базы данных, а затем объедините изменения из моделей представления в прикрепленный граф сущностей - это то, что я использую.

Более сложное описаниев другой ответ .Все это становится намного хуже, когда вы работаете с отношениями «многие ко многим» или «один ко многим», когда связанные сущности могут изменить родителя.

0 голосов
/ 19 мая 2011

Есть только два способа выяснить, что изменилось.

  1. Вы можете отслеживать изменения на стороне клиента с помощью JavaScript.Это будет означать, что когда вы публикуете форму, ваш javascript перехватывает пост и сравнивает его с исходными данными, с которыми он загружал экран.
  2. Вы можете перебирать дочерние объекты и сравнивать их с объектами из вашегоконтроллер.Если есть различия, вы можете сохранить их.

Есть один способ сохранить, не зная, какие изменения могут быть немного более эффективными.Однако для этого потребуется создать пользовательский запрос и использовать MQL-запрос TSQL:

http://technet.microsoft.com/en-us/library/bb510625.aspx

...