2012-02-29 4 views
-4

Упрощенный, у меня есть структура Entity Framework, отображающая две таблицы для объектов: Items и Properties. Каждый элемент имеет определенные свойства (один для многих).Добавление, удаление и обновление связанных объектов

Из-за пределов моей программы я получаю «мертвые» элементы со свойствами, являющимися новинками или обновлениями существующих предметов, с их свойствами. Эти данные могут быть вызваны вызовом WCF, веб-формой POST, десериализации: я хочу вставить и обновить элементы и свойства в базе данных с несвязанными данными, которые я получаю.

Я нашел различные related questions и answers (из которых не все even compile). Проблема, я должен написать кучу кода для синхронизации свойств существующего элемента и входящего, обновленный пункт:

private static void UpdateProperties(Item existingItem, Item updatedItem, TestdatabaseEntities context) 
{ 
    // Find deleted properties 
    foreach (var existingProp in existingItem.Properties.ToList()) // ToList() to work on a local copy, otherwise you'll be removing items from an enumeration 
    { 
     var inUpdate = updatedItem.Properties.Where(p => p.Name == existingProp.Name).FirstOrDefault(); 

     if (inUpdate == null) 
     { 
      // Property with this Name was not found as property in the updated item, delete it 
      context.Properties.DeleteObject(existingProp); 
     } 
    } 

    // Find added or updated properties 
    foreach (var updatedProp in updatedItem.Properties) 
    { 
     var inDatabase = existingItem.Properties.Where(p => p.ItemID == existingItem.ID && p.Name == updatedProp.Name).FirstOrDefault(); 

     if (inDatabase == null) 
     { 
      // Added 
      inDatabase = new Property { Name = updatedProp.Name }; 
      existingItem.Properties.Add(inDatabase); 
     } 

     // Updated (& added), map properties (could be done with something like AutoMapper) 
     inDatabase.Value = updatedProp.Value; 
     // etc... 
    } 

    context.SaveChanges(); 
} 

Вы видите, есть различные ссылки на конкретные свойства объектов (existingItem.Properties, p.Name == existingProp.Name, p.ItemID == existingItem.ID), но это будет возможно для создания более общей версии этого метода и, возможно, даже скрипки в небольшой рекурсии (что, если у самого Property есть ссылки на другие объекты?).

Однако мне было интересно: может ли это (весь процесс или его части) сделать более легко? И нет, я не могу удалить все свойства из элемента и повторно добавить их при обновлении, потому что есть другие данные в тех объектах, которые я хочу сохранить.

+1

Проблема, которую вы описали, звучит как упражнение для сопоставления объектов. Если я правильно вас понял, вы можете найти http://automapper.org/ полезным. – Robert

+0

@Robert сопоставление не является проблемой (см. Комментарий выше строки 'inDatabase.Value'), но как сравнить отдельные элементы с прикрепленными и обновить последний, если требуется более элегантным способом, чем отображается. – CodeCaster

+9

Мне нравится, как этот вопрос случайно случайно приостанавливается, когда я не согласен с чьим-то явно неправильным ответом и стараюсь объяснить это в комментарии. Пожалуйста, продолжайте делать это, эти 2 очка вычитают так много вреда каждый раз. – CodeCaster

ответ

3

Как разработчик, ваша работа заключается в написании кода :), и это не «много кода».

Глобального общего способа обработки этого кода не существует. Вероятно, вы можете найти способ обобщить ваш образец, но он по-прежнему будет адаптирован только для определенного набора случаев. Ваш простой метод содержит много кода, который тесно связан с классом Item и Property. Обобщение этого кода потребует ввода делегатов или выражений, обрабатывающих эти зависимости вне вашего метода.

+7

Как разработчик, моя работа - постоянно думать: «Можно ли это сделать лучше?» _, Следовательно, мой вопрос. ;-) Я надеялся, что существует более общий способ сделать это, желательно встроенный в EF, потому что, как я сказал, это упрощенный пример, и я не хочу повторять свой код. – CodeCaster

+3

Нет EF не содержит встроенного механизма для решения этой проблемы - [здесь] (http://stackoverflow.com/questions/3635071/update-relationships-when-saving-changes-of-ef4-poco-objects/3635326 # 3635326) - это мой анализ. –

+1

Я уже нашел этот отличный пост, теперь я вижу, что забыл связать его с моим вопросом. Спасибо, в любом случае. – CodeCaster