Entity 4.1 Обновление существующей родительской сущности новыми дочерними сущностями

У меня есть приложение, в котором вы можете создать новый тип продукта и добавить к нему некоторые ингредиенты.И продукт, и ингредиенты - это объекты, сохраненные в базе данных. Сущность продукта содержит набор сущностей ингредиентов.

(упрощенная версия)

public class Product
   Public Sub New()
     Me.Ingredients = New List(Of Ingredient)()
   End Sub

   Property Ingredients as ICollection(Of Ingredient)
end class

Когда я впервые сохраняю продукт, все идет хорошо: я просто добавляю его в контекст и вызываю SaveChanges.

myDataContext.Products.Add(product)
myDataContext.SaveChanges()

И продукт (родительский), и ингредиенты (дочерние) сохраняются и связаны друг с другом. Все хорошо.

Однако, когда я добавляю / удаляю ингредиент в существующий продукт, я начинаю сталкиваться с проблемами. Сначала я очищаю существующую коллекцию ингредиентов в сущности продукта, а затем снова добавляю обновленный список ингредиентов (я не использую повторно ингредиенты, добавляя момент). Затем я изменяю состояние объекта продукта на измененное и вызываю savechanges. Однако при изменении состояния я получаю исключение « Объект с таким же ключом уже существует в ObjectStateManager ».

myDataContext.Entry(product).State = EntityState.Modified

После "некоторого" поиска я понял, что проблема в том, что все ингредиенты имеют первичный ключ 0 (поскольку они еще не добавлены), и когда вы меняете состояние родительского объекта (продукта), все дочерние сущности (ингредиенты) присоединяются к контексту с ключом 0, что вызывает проблему, поскольку ключи больше не уникальны.

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

Я использую Entity Framework 4.1 и Code First.

Надеюсь, ты сможешь мне помочь!

27
задан xr280xr 22 September 2017 в 19:34
поделиться