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