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