Упрощенный, у меня есть структура 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
есть ссылки на другие объекты?).
Однако мне было интересно: может ли это (весь процесс или его части) сделать более легко? И нет, я не могу удалить все свойства из элемента и повторно добавить их при обновлении, потому что есть другие данные в тех объектах, которые я хочу сохранить.
Проблема, которую вы описали, звучит как упражнение для сопоставления объектов. Если я правильно вас понял, вы можете найти http://automapper.org/ полезным. – Robert
@Robert сопоставление не является проблемой (см. Комментарий выше строки 'inDatabase.Value'), но как сравнить отдельные элементы с прикрепленными и обновить последний, если требуется более элегантным способом, чем отображается. – CodeCaster
Мне нравится, как этот вопрос случайно случайно приостанавливается, когда я не согласен с чьим-то явно неправильным ответом и стараюсь объяснить это в комментарии. Пожалуйста, продолжайте делать это, эти 2 очка вычитают так много вреда каждый раз. – CodeCaster