EF AddOrUpdate Seed не обновляет дочерние объекты
У меня возникли проблемы с обработкой данных, и я смог воспроизвести проблему с помощью очень маленького приложения.
Если у вас есть этот метод семян:
protected override void Seed(JunkContext context)
{
context.Junks.AddOrUpdate(x => x.Name,
new Junk()
{
Name = "BANANAS!!",
Item = new JunkItem()
{
Name = "APPLES!!!"
}
}
);
}
при запуске базы данных обновлений в PMC все объекты создаются успешно. Хорошо.
Но когда вы хотите пойти и обновить базу данных, скажите, что ваш метод seed теперь:
protected override void Seed(JunkContext context)
{
context.Junks.AddOrUpdate(x => x.Name,
new Junk()
{
Name = "BANANAS!!",
Item = new JunkItem()
{
Name = "ORANGES!!!"
}
}
);
}
Детский объект не обновляется. Кажется, единственный способ, которым мы можем повторно засеять, - это стереть базу данных и все это изменить. Я думаю, что я понимаю, почему это не работает так, как я ожидаю, но, возможно, кто-то может указать мне в правильном направлении, чтобы соответствующим образом обновить этот метод семени. Я знаю, что могу просто написать контекст .JunkItems. (...), но похоже, что он превзойдет все цели "AddOrUpdate".
Думаю, мне нужно было бы определить "ключи" для каждого дочернего объекта. Пример: "Junk" получает x = > x.Name, но 'JunkItem' в настоящее время должен установить 'update key'. Я предполагаю, что проблема, но как я буду заниматься этим?
Ответы
Ответ 1
Никакая команда в EF автоматически не обновляет дочерние элементы - AddOrUpdate
не является различием, она внутренне проверяет существование сущности верхнего уровня (Junk
в вашем случае) и вставляет или обновляет его, если он не существует. Вставка детей является побочным эффектом в этом случае, потому что когда AddOrUpdate
внутренне вызывает Add
, он добавляет все дерево объектов. AddOrUpdate
действительно намного менее волшебна, чем люди ожидают, но даже при этом небольшом количестве магии его следует использовать только в поселении миграции, потому что это довольно дорогостоящая операция (дополнительная обратная связь с базой данных для каждой сущности и много отражения).
Ребенок должен всегда обновляться отдельно - для поиска правильного дочернего и обычного обновления EF могут потребоваться ваши собственные отдельные запросы к базе данных.