Mam aplikację, w której można utworzyć nowy typ produktu i dodać do tego produktu niektóre składniki. Produkt i składniki są jednostkami zapisanymi w bazie danych. Podmiot produktu ma kolekcję składników.Jednostka 4.1 Aktualizacja istniejącej jednostki nadrzędnej za pomocą nowego elementu podrzędnego Jednostki
(wersja uproszczona)
public class Product
Public Sub New()
Me.Ingredients = New List(Of Ingredient)()
End Sub
Property Ingredients as ICollection(Of Ingredient)
end class
Kiedy zapisać produkt po raz pierwszy, wszystko idzie dobrze: po prostu dodać je do kontekstu i SaveChanges zadzwonić.
myDataContext.Products.Add(product)
myDataContext.SaveChanges()
Zarówno produkt (rodzic) i składniki (dzieci) są zapisane i powiązane ze sobą. Wszystko dobrze.
Jednak gdy dodaję/usuwam składnik do istniejącego produktu, zaczynam mieć problemy. Najpierw wyczyściłem istniejącą kolekcję składników w jednostce produktu, a następnie ponownie dodałem zaktualizowaną listę składników (nie używam ponownie składników, aby dodać chwilę). Następnie zmieniam stan encji produktu na zmodyfikowany i wywołuję zmiany składowania. Na stanie zmieniającym I pojawia się jednak wyjątek "Obiekt z tym samym kluczem już istnieje w ObjectStateManager".
myDataContext.Entry(product).State = EntityState.Modified
Po „jakiś” Searching zorientowali się, że problemem jest to, że wszystkie składniki mają podstawowy klucz 0 (ponieważ nie są one jeszcze dodane) i po zmianie stanu jednostki dominującej (produkt), wszystkie elementy podrzędne (składniki) są dołączone do kontekstu za pomocą klucza 0, co powoduje problem, ponieważ klucze nie są już unikalne.
Szukałem rozwiązania, ale nie mogę wymyślić, jak rozwiązać ten problem. Próbowałem dodać składniki do kontekstu przed zmianą stanu, ale wtedy brakuje powiązania między produktem a składnikami ... Jak zaktualizować istniejącą jednostkę nadrzędną o nowe, jeszcze nie dodane elementy podrzędne?
Używam Entity Framework 4.1 i Code First.
Mam nadzieję, że możesz mi pomóc!
Działa to absolutnie idealnie !! Wielkie dzięki! – DirkDooms
Dużo czasu zajęło mi znalezienie prawidłowej aktualizacji jednostek. Dziękujemy za kontekst.Entry (productInDb) .CurrentValues.SetValues (produkt); –
To jest świetne, teraz muszę po prostu wymyślić, jak sprawić, by działało poprzez refleksję, dzięki czemu mogę przeglądać wszystkie kolekcje na jednostce, którą zapisuję. – Nikkoli