To pojawiło się wielokrotnie dla nas. Po przeczytaniu takiej wiadomości nie ma nic intuicyjnego do zrobienia i debugowania.Jak naprawić "EntityMemberChanged został wywołany bez pierwszego wywołania EntityMemberChanging"
Odpowiedz
Co to słabo udokumentowane błąd próbuje powiedzieć to to, że przypadkowo skonfigurować system, w którym śledzenie zmian powoduje więcej zmian.
Gdy Entity Framework zmienił właściwość w jednej z twoich jednostek, na przykład podczas SaveChanges z aktualizacjami ID identyfikatora, uruchomiłeś kod, który zmienił inne śledzone właściwości.
Na przykład właściwość, że Entity Framework zachodziło wywołał zdarzenie, może INotifyPropertyChanged
, który być może został subskrybowany przez BindingSource
lub jakiejś listy wiązania, którego ListChanged
event handler był w interfejsie i wywołał obliczenie jakiegoś innego mienia , a moduł do śledzenia zmian wykrył drugą zmianę właściwości.
Prosta diagnoza polega na umieszczeniu punktu przerwania w wywołaniu SaveChanges() i zaraz po wywołaniu funkcji SaveChanges(). Po trafieniu pierwszego punktu przerwania umieść punkt przerwania na każdej procedurze obsługi zdarzeń, która może zostać uruchomiona. (BindingSources
są znane ze zwielokrotnienia wydarzeń.) Kontynuuj debugowanie. Jeśli którykolwiek punkt przełomowy zostanie trafiony inaczej niż punkt następujący bezpośrednio po SaveChanges, wiesz, gdzie jest problem.
Proste rozwiązanie polega na ustawieniu flagi, na przykład IsSaving
, po każdej stronie wywołania SaveChanges. Następnie w każdym niewłaściwie działającym programie obsługi zdarzeń, wykonaj prostą kontrolę i nie modyfikuj żadnych encji, jeśli DbContext jest w trakcie zapisywania. Upewnij się, że używasz finally
w przypadku SaveChanges zgłasza wyjątek, że złapać na wyższym poziomie:
IsSaving = true;
try
{
await db.SaveChangesAsync()
}
finally
{
IsSaving = false;
}
(Inną możliwością jest to, że zostały zmieniania podmiotu z wielu wątków — nigdy wiązać trackera zmiana w wielokrotności wątki!)
Miałem dokładnie ten sam problem. Podłączyłem się do zdarzenia INotifyPropertyChanged, które stworzyło możliwość zmiany właściwości podczas wywołania SaveChanges(). Myślę, że lepiej jest odłączyć funkcje obsługi zdarzeń od śledzonych encji podczas wykonywania dbContext.SaveChanges(), Remove().
Nieużywanie często stanowi najbezpieczniejszą i najlżejszą alternatywę. Jednak dla nas istnieje przypadek, w którym warto być powiadamianym o zmianie, nawet jeśli nie ustawiamy właściwości Entity Framework-visible w tym czasie. – jnm2
Wyjaśnię moje doświadczenia z tym błędem, mając nadzieję, że może to komuś pomóc. I dzięki jnm2 za piękne wyjaśnienie.
miałem faktury i otrzymania podmiotów oraz InvoiceViewModel. Thie ViewModel zasubskrybowano właściwość Faktura zmieniona, wewnątrz której gromadzono zdarzenia CanExecuteChanged.
dodałem Otrzymanie faktury właściwość nawigacji i nazwał SaveChanges(), dzięki czemu poziom Invoice.ReceiptID własności zmieniło i wyzwalanych OnPropertyChanged obsługi zdarzeń na ViewModel, który z kolei podniesioną wszelkiego rodzaju imprez CanExecuteChanged.
Problem było, że jeden z puszki nazwa_polecenia Execute metody dzwoni Context.ChangeTracker.HasChanges() które ostatecznie zwrócił wyjątek.
Jak to naprawiłem? Podążałem za jnm2, oznaczyłem maszynę wirtualną za pomocą IsSaving i zaznaczono flagę wewnątrz programu obsługi zdarzeń OnPropertyChanged.
Jeszcze raz dziękuję jnm2 i mam nadzieję, że ktoś również uzna to za pomocne.
- 1. Błąd:: jQuery nie został wywołany
- 2. UIAlertController: supportedInterfaceOrientations został wywołany rekursywnie
- 3. Jak sprawdzić, czy podprogram został wywołany z metodą wywołania obiektu, czy nie
- 4. Dlaczego RecyclerView onBindViewHolder został wywołany tylko raz?
- 5. Wykrywanie, czy wywoływacz został wywołany (.Net)
- 6. Blok UIAlertAction nie został wywołany - iOS
- 7. "Błąd w int_abline ... fabuła.new nie został jeszcze wywołany"
- 8. Lokalny detektor zdarzeń wywołany, mimo że obiekt nie został skonstruowany
- 9. Jak naprawić błąd kompilacji dla nieobsługiwanego wyjątku podczas wywołania Thread.sleep()?
- 10. Wykryj, który element AnimationEnd został wywołany przez animacjęName
- 11. Błąd przetwarzania GroovyPageView: getOutputStream() został już wywołany dla tej odpowiedzi
- 12. Dlaczego nie został wywołany konstruktor ruchu std :: string?
- 13. Czy można sprawdzić, czy WSAStartup został wywołany w procesie?
- 14. Jak mogę naprawić dokument PDF, który został zeskanowany wstecz?
- 15. jak naprawić procesor adnotacji nie został znaleziony w IntelliJ?
- 16. Idiomatyczny sposób wywołania pierwszego wystąpienia określonego konstruktora z listy
- 17. addSMA nie został narysowany na wykresie, gdy został wywołany z funkcji
- 18. Jak naprawić niejednoznaczność w Przeciążeniu w Kotlin (bez lambda)?
- 19. View.onDraw() --- kiedy zostanie wywołany?
- 20. Użyj rury bez podawania pierwszego argumentu
- 21. Qt został zbudowany bez pomocy ICU, WebKit został wyłączony. VS2012
- 22. Jak znaleźć pierwszego znaku ciągu znaków bez użycia metody API
- 23. Jak cofnąć ditmę git rm -rf bez pierwszego zatwierdzenia?
- 24. after_create wywołany po nieudanym zapisaniu?
- 25. Jak mogę sprawdzić, czy kontroler został wywołany przy użyciu postu lub uzyskać?
- 26. Jak ustalić, który element został wywołany przy wywołaniu metody jquery .keyup?
- 27. konstruktorzy klasa nie może być wywołany bez 'nowych'
- 28. Jak naprawić tabelę MySQL bez korzystania z phpMyAdmina?
- 29. Metoda wywołania w Pythonie bez 'self'
- 30. Uzyskiwanie kompilacji GCC bez wstawiania wywołania memcpy
Piękne wyjaśnienie, dziękuję bardzo! – Dan
Dziękujemy za przesłanie zarówno pytania, jak i szczegółowej odpowiedzi! – Hannish