Как обновить связанные записи разных таблиц при использовании Entity Framework 4.0? - PullRequest
2 голосов
/ 14 февраля 2012

Есть ли более короткий способ сделать это обновление?

void Update(Table1 table1Entry, Table2[] table2entries)
{
    entities.Table1.Attach(table1Entry);
    var table2EntriesIds = table2entries.Select(a => a.Id);
    var updates = entities.Table2
        .Where(a => table2EntriesIds.Contains(a.Id));
    foreach(var update in updates)
    {
        entities.Table2.Attach(update);
    }

    var deletions = entities.Table2
        .Where(a => a.Table1Id == table1Entry.Id);
        .Where(a => !table2EntriesIds.Contains(a.Id));
    foreach(var deletion in deletions)
    {
        entities.DeleteObject(deletion);
    }

    var insertions = table2entries.Except(matches);
    foreach(var insertion in insertions)
    {
        entities.AddToTable2(insertion);
    }

    entities.SaveChanges();
}

, где у Table2 есть внешний ключ Table1_Id.

1 Ответ

1 голос
/ 15 февраля 2012

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

Вопрос в том, работает ли ваш код.Я думаю, что нет.Он не обновляет записи, потому что не изменяет состояние записей на измененные.Вы также не можете снова прикрепить запись, загруженную из контекста.В качестве последнего пункта, если эти table1 и table2 как-то связаны, я не вижу никакого кода, работающего с самим отношением (если вы не используете свойства FK).

...