Подтвердить что ты не робот

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'. Я предполагаю, что проблема, но как я буду заниматься этим?

4b9b3361

Ответ 1

Никакая команда в EF автоматически не обновляет дочерние элементы - AddOrUpdate не является различием, она внутренне проверяет существование сущности верхнего уровня (Junk в вашем случае) и вставляет или обновляет его, если он не существует. Вставка детей является побочным эффектом в этом случае, потому что когда AddOrUpdate внутренне вызывает Add, он добавляет все дерево объектов. AddOrUpdate действительно намного менее волшебна, чем люди ожидают, но даже при этом небольшом количестве магии его следует использовать только в поселении миграции, потому что это довольно дорогостоящая операция (дополнительная обратная связь с базой данных для каждой сущности и много отражения).

Ребенок должен всегда обновляться отдельно - для поиска правильного дочернего и обычного обновления EF могут потребоваться ваши собственные отдельные запросы к базе данных.