У меня есть приложение, в котором вы можете создать новый тип продукта и добавить к нему некоторые ингредиенты.И продукт, и ингредиенты - это объекты, сохраненные в базе данных. Сущность продукта содержит набор сущностей ингредиентов.
(упрощенная версия)
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.
Надеюсь, ты сможешь мне помочь!