2013-03-22 14 views
6

Próbuję odrzucić pewne zmiany za pomocą funkcji przeładowania. Dostaję InvalidOperationException. Jak mogę temu zapobiec?Entity Framework 5 InvalidOperationException na przeładowaniu

DbContext.SaveChanges(); 
//Entity is in Unchanged state 
//Make some changes to an entity 
//Change state to modified 
DbContext.Entry(entity).Reload(); 

InvalidOperationException
EntityMemberChanged lub EntityComplexMemberChanged nazwano bez uprzedniego nazywając EntityMemberChanging lub EntityComplexMemberChanging na ten sam tracker zmienia się z tej samej nazwie. Informacje na temat poprawności zgłaszania zmian w dokumentacji można znaleźć w dokumentacji Entity Framework .

EDIT:
mam włączać i wyłączać ProxyCreationEnabled, LazyLoadingEnabled.
Próbowano różnych podejść. Wszystkie te próby rzucają ten sam wyjątek.

var objContext = ((IObjectContextAdapter)context).ObjectContext; 
objContext.Refresh(RefreshMode.ClientWins, entry.Entity); 


entry.OriginalValues.SetValues(entry.GetDatabaseValues()); 

nadzieję, że uzyskać rozwiązanie. Nie chcę pozbyć się pełnego DbContext, aby ponownie załadować wszystkie dane.

+1

Czy któryś z nich może pomóc? http://stackoverflow.com/questions/5221314/refresh-entity-instance-with-dbcontext lub ten http://stackoverflow.com/questions/5799737/entity-framework-4-1-dbset-reload lub ten http: //connect.microsoft.com/VisualStudio/feedback/details/694567/entitymemberchanged-or-entitycomplexmemberchanged-was-called-without- first-calling-entitymember-zmienne-lub-z-stosowaniem-systemu-zmiennego-z -same-zmienia-tracker-- ta sama nazwa własności ?? – LiverpoolsNumber9

+0

To może nie mieć nic wspólnego z twoją sytuacją, ale chciałem sprawdzić .. Czy robisz jakiś rodzaj wielowątkowości/asynchronizacji w twoim programie? Podobnie jak przy użyciu dowolnego PLINQ lub 4.5 async/czekają? – tostringtheory

+0

@tostringtheory Allready sprawdził go bez żadnych wątków. Taki sam problem. –

Odpowiedz

2

Cytując this MSDN thread/post

„warto zauważyć, że błąd pojawia się, czy nie skorzystać ze zmianami śledzenie poprzez klasę proxy lub zadzwoń entitymemberchanged jednoznacznie. Wydaje mi się, pojawia się błąd, gdy wykonam entitymemberchanging i zmieniane aa poza tym, który utworzył objectcontext/objectstatemanager, niezależnie od tego, czy wykonuję dwie funkcje synchronicznie, czy asynchronicznie, używaj blokad lub mam wątek jawnie uśpiony, zdaje mi się, że jest to jakiś "prawdziwy błąd" z objectstatemanager , a nie coś, co byłoby prostym obejściem, piłka jest w twoim sądzie, MSFT. "

P.S. Zbyt długo na komentarz.

+0

ok dzięki. Zrobiłem inne obejście. –

0

Jeśli kod jest taki, jak go wysłałeś, gdzie obiekt jest ładowany z DbContext, a następnie ponownie załadowany z tego samego DbContext, nie powinieneś jawnie oznaczać go jako zmodyfikowany; wprowadzenie zmian w jednostce wystarczy, aby oznaczyć ją jako zmodyfikowaną już. Innymi słowy:

var o = new SimpleObject { Stuff = "One" }; 
db.SimpleObjects.Add(o); 
db.SaveChanges(); 

o.Stuff = "Two"; // implicitly marks as Modified for you, since it's still Attached 

// Unnecessary 
//db.Entry(o).State = System.Data.EntityState.Modified; 

db.Entry(o).Reload(); // Works for me 
0

Znalazłem, że ponowne ładowanie się nie udaje na podmiotach proxy, które mają właściwości nawigacji.

Jako pracy wokół zresetować bieżące wartości, a następnie załaduj tak:

var entry = DbContext.Entry(entity); 
entry.CurrentValues.SetValues(entry.OriginalValues); 
entry.Reload(); 
0

miałem podobną sytuację, z tym samym opisem wyjątków. W moim przypadku próbowałem usunąć encję z kontekstu i było to w jakiś sposób związane z wciąż wywoływanym propagatorem.

Właśnie usunął obsługi przed wyjęciem z kontekstu podmiot z

MyEntity.PropertyChanged -= MyPropertyChangedHandler; 
context.MySet.Remove(MyEntity); //it works after removing the handler 

Hope this helps kogoś.

Powiązane problemy