2013-03-22 15 views
6

Ich versuche, einige Änderungen mit der Reload-Funktion zu verwerfen. Ich bekomme eine InvalidOperationException. Wie kann ich das verhindern?Entity Framework 5 InvalidOperationException beim Reload

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

InvalidOperationException
EntityMemberChanged oder EntityComplexMemberChanged ohne erste Aufruf EntityMemberChanging oder EntityComplexMemberChanging auf die gleiche Änderung Tracker mit der gleichen Eigenschaft Name aufgerufen wurde. Informationen zur ordnungsgemäßen Meldung von Änderungen finden Sie in der Dokumentation des Entity Framework .

EDIT:
Ich habe aktiviert und deaktiviert ProxyCreationEnabled, LazyLoadingEnabled.
Versuchte verschiedene Ansätze. Alle diese Versuche werfen die gleiche Ausnahme.

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


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

hoffe, dass ich eine Lösung. Möchten Sie nicht den gesamten DbContext ablegen, um alle Daten neu zu laden.

+1

Würde einer dieser Punkte helfen? http://stackoverflow.com/questions/5221314/refresh-entity-instance-with-dbcontext oder das http://stackoverflow.com/questions/5799737/entity-framework-4-1-dbset-reload oder dieses http: //connect.microsoft.com/VisualStudio/feedback/details/694567/entitymemberchangeed-or-entitycomplexmemberchanged-was- genannt- ohne- first- calling- entitymemberchanging-or-henitycomplexmemberchanging-on-the-same-change-tracker-with- der-selbe-Eigenschaft-Name ?? – LiverpoolsNumber9

+0

Dies hat vielleicht nichts mit Ihrer Situation zu tun, aber wollte überprüfen .. Machen Sie irgendeine Art von Multithreading/Async in Ihrem Programm? Wie mit jedem PLINQ oder 4.5 async/warten? – tostringtheory

+0

@tostringtheory Bereits überprüft, ohne Threading. Gleiches Problem. –

Antwort

2

this MSDN thread/post

„unter Hinweis darauf, es lohnt sich zu zitieren, dass der Fehler auftaucht, ob Sie Änderung verwenden eine über einen Proxy-Klasse-Tracking oder explizit entitymemberchanged nennen. Ich scheine den Fehler zu erhalten, wann immer ich execute entitymemberchanging und verändert auf Ein Thread außerhalb desjenigen, der den objectcontext/objectstatemanager erstellt hat, unabhängig davon, ob ich die beiden Funktionen synchron oder asynchron ausführe, locks benutze oder den Thread explizit schlafen lasse, es ist für mich eine Art "echter Bug" mit dem objectstatemanager und nicht etwas, für das es einen einfachen Workaround gäbe. Ball ist in deinem Gericht, MSFT. "

P.S. Zu lange für einen Kommentar.

+0

ok danke. Ich habe einen anderen Workaround gemacht. –

0

Wenn der Code so ist, wie Sie ihn gepostet haben, wo das Objekt von einem DbContext geladen und dann von demselben DbContext neu geladen wird, sollten Sie es nicht explizit als Modifiziert markieren; Änderungen an der Entität sind ausreichend, um sie bereits als Modifiziert zu markieren. Mit anderen Worten:

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

fand ich, dass das Neuladen auf Proxy-Einheiten ausfällt, die Navigationseigenschaften haben.

Als Arbeit um, setzen Sie die aktuellen Werte und dann wie folgt neu zu laden:

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

Ich hatte eine ähnliche Situation, mit der gleichen Ausnahme Beschreibung. In meinem Fall habe ich versucht, eine Entität aus dem Kontext zu löschen, und sie war irgendwie mit einem propertychanged-Handler verbunden, der immer noch aufgerufen wird.

Ich entfernte gerade den Handler, bevor Sie die Einheit aus dem Zusammenhang mit

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

Hope this jemand hilft zu entfernen.

Verwandte Themen