MVC 3 отдельная сущность, сохраняющая связанных детей должным образом - PullRequest
0 голосов
/ 13 октября 2011

Проблема:

Мне нужно сохранить обновленный отдельный объект EF в базе данных.

Удаленная сущность создается путем связывания базовой сущности, затем

  foreach child ...
     entity.children.add(child)

Я добавляю массив дочерних объектов, который я также получаю из bind в контроллере.

Я хочу, чтобы старая сущность была полностью заменена новой, это означает:

entity.property => update (easy)
entity.child => delete old child if not exists in the new,
                update if already exists (easy),
                or add if it doesnt exist already

Что у меня так далеко:

items tempitem = new items() { id = item.id };
_context.items.Attach(tempitem);
_context.items.ApplyCurrentValues(item);
foreach (var itemchild in item.children)
{
    childEntity tempchild= new childEntity () { parentid = item.id };
    _context.childEntity.Attach(tempchild);

    _context.childEntity.ApplyCurrentValues(itemchild );
}

Это позволяет мне точно обновлять базовую сущность, а также обновлять любые существующие сущности.

Это не позволяет мне удалять старые объекты - попытался сделать

item.children.Clear()

но ничего не происходит, а также когда я пытаюсь добавить новую дочернюю сущность (которая была привязана к отключенному) - тоже ничего не происходит.

Это не может быть слишком сложно, не так ли? Я думаю о том, чтобы обратиться к NHibernate, где все кажется менее раздутым и более простым, но мощным ...

1 Ответ

0 голосов
/ 02 декабря 2011

По сути, вы должны загрузить исходный граф объектов из базы данных (родительские и все дочерние элементы, например, используя Include), в противном случае EF не может знать, какие дочерние элементы являются новыми, а какие были удалены.Затем необходимо добавить или удалить дочерние элементы, сравнив загруженную исходную коллекцию дочерних элементов с текущей коллекцией в отдельном объекте.

Пример того, как это сделать, приведен здесь: https://stackoverflow.com/a/5540956/270591

...