Упрощенно, у меня есть Entity Framework, отображающий две таблицы на объекты: Items
и Properties
. Каждый предмет имеет определенные свойства (от одного до многих).
Из-за пределов моей программы я получаю «мертвые» элементы со свойствами, которые являются новыми элементами или обновлениями существующих элементов, с их свойствами. Эти данные могут быть из вызова WCF, веб-формы POST, десериализации: дело в том, что я хочу вставлять и обновлять элементы и свойства в базе данных с помощью несвязанных данных, которые я получаю.
Я нашел различные связанные вопросы и ответы (из которых не все даже компилируются ). Проблема в том, что мне нужно написать множество кода для синхронизации свойств существующего элемента и входящего обновленного элемента:
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
есть ссылки на другие объекты?).
Однако мне было интересно: можно ли это (весь процесс или его части) сделать проще? И нет, я не могу удалить все Свойства из Предмета и повторно добавить их после обновления, потому что в этих сущностях есть другие данные, которые я хочу сохранить.