Добавление, удаление и обновление связанных объектов - PullRequest
0 голосов
/ 29 февраля 2012

Упрощенно, у меня есть 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 есть ссылки на другие объекты?).

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

1 Ответ

3 голосов
/ 01 марта 2012

Как разработчик, ваша задача - написать код :), и это не "много кода".

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...