2017-11-15 5 views
0

Bis jetzt habe ich EF Change was auch immer tun lassen Sie es hinter den Kulissen tun muss, aber ich bin hier gezwungen zu intervenieren, weil es tatsächlich ist, die Eigenschaften auf meine Objekte ändern:Warum ändert EF DetectChanges() tatsächlich Objekte?

db.Configuration.AutoDetectChangesEnabled = false; 
var loadedEntity = db.SomeEntity.Include(e => e.SomeChildren); 

//modify the loadedEntity in some way 

//if I debug and inspect 'loadedEntity' here, everything looks good! 

db.ChangeTracker.DetectChanges(); 

//if I inspect here, the properties inside 'loadedEntity' have changed! 

In meinem Fall, EF hat aus irgendeinem Grund einen Fremdschlüssel auf eines der Kinder gelegt, was mir Probleme bereitet. Dieser Schlüssel war im Debug korrekt, bevor DetectChanges() aufgerufen wurde.

Ist das, was in Debug angezeigt wird, falsch, oder ändert DetectChanges() tatsächlich das Objekt hinter den Kulissen? Es ist nicht klar, warum das passiert, also versuche ich ein Verständnis zu bekommen.

Ich nahm vorher an, ChangeTracker behielt einfach seine eigene Liste/Werte von ursprünglichen und neuen Eigenschaften und dachte, was zu tun war, wenn SaveChanges() aufgerufen wurde? Ich würde nicht erwarten, dass der Tracker die Objekte selbst verändert.

(Entity Framework 6.1.3) 

Antwort

0

Lass mich raten.

Es gibt Entitäten, die von SomeChildern referenziert werden, und ich denke, Lazy Loading ist in der Anwendung aktiviert. Laut Dokumentation Header einschliessen es kehrt IQueriable so müssen Sie .ToList oder .load nach so einbeziehen nennen, dass die Elemente aus der Datenbank abgerufen werden.

DbContext.Entry(someEntity).Include(e => e.SomeChildren).Load(); 
+0

Hmm Ich habe gerade versucht, "db.Configuration.LazyLoadingEnabled = false;" aber ich bekomme immer noch das gleiche Problem. Reicht das aus oder wird ein .ToList/.Load noch benötigt? – FBryant87

+0

fügen Sie den Code der Zeile I in der Antwort erwähnt hinzu. Es sollte funktionieren –

+0

db.Entry(). Include() ist keine Option in dieser Version, so dass ich stattdessen Reference() und Collection() verwenden muss - derzeit versucht herauszufinden, wie Kinder mit dem letzteren auswählen. Gibt es einen triftigen Grund, warum LazyLoadingEnabled = false nicht das gleiche Verhalten hervorbringt, denkst du? – FBryant87

Verwandte Themen