2012-09-03 5 views
9

Ich habe eine WPF-App, die ein Raster mit einer Liste von Daten, die ich mit EF geladen hat. Einige andere Fenster können Änderungen an denselben Daten vornehmen, die auf dem Raster geladen sind, aber eine andere dbcontext-Instanz verwenden. Wie kann ich die geänderten Daten im Grid sehen? Ich weiß, ich kann eine einzige Entität mit ctx.Entry<MyEntity>(instance).Reload(); aktualisieren - aber ich möchte alle Änderungen sehen und egal was ich tue, sehe ich nur die alten Werte. Ich kann AsNoTracking nicht verwenden und in diesem Fall keine neue DbContext Instanz erstellen.Laden von Änderungen in einem anderen DbContext

+0

Warum können Sie 'AsNoTracking' nicht verwenden? –

+0

Da der Benutzer Änderungen direkt in das Raster vornehmen und speichern kann. – user1526627

+0

Aber in diesem Fall können Sie nicht gespeicherte Daten bearbeitet haben und das Nachladen kann dazu führen, dass diese Daten unterschiedlich sind? Wie möchten Sie dieses Problem lösen? –

Antwort

13

Für mich sieht wie ein sehr einfacher Fall aus und ich kann nicht sehen, warum EF nicht nur die Werte der Entitäten aktualisieren.

EF verfügt ebenfalls über diesen Mechanismus, ist jedoch in DbContext API nicht verfügbar. Sie müssen zu ObjectContext zurückkehren. Wenn Sie nur von Entitäten auf nachladen wollen Sie rufen:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
objectContext.Refresh(RefreshMode.StoreWins, listOfEntitiesToReload); 

RefreshMode.StoreWins bewirkt, dass alle anstehenden Änderungen durch neu geladene Werte überschrieben werden. Sie können auch RefreshMode.ClientWins verwenden, die Ihre Änderungen speichert und sie mit neu geladenen Daten zusammenführt. Das Problem bei diesem Ansatz besteht darin, dass nur Entitäten neu geladen werden, die Sie bereits besitzen. Du erhältst keine neuen Entitäten.

Wenn Sie neue Einheiten erhalten, wie gut Sie müssen eine Abfrage ausführen, und Sie müssen EF sagen, dass Sie wollen Werte neu zu laden:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
var objectSet = objectContext.CreateObjectSet<MyEntity>(); 
objectSet.MergeOption = MergeOption.OverwriteChanges; 
var result = objectSet.Where(...).ToList(); 

Wieder MergeOption.OverwriteChanges überschreibt alle ausstehenden Änderungen, aber Sie können MergeOption.PreserveChanges verwenden zu fusionieren Reloaded Werte zu Ihren bearbeiteten Werten.

Ich denke, es kann noch einige Probleme mit dem Aktualisieren von Werten mit einigen Relationen und vielleicht auch Entitäten geben, die in der Datenbank gelöscht wurden.

+0

Dies ist genau das, was ich brauche, danke, mein Glaube an EF ist wieder hergestellt :) – user1526627

+0

@ ladislav-mrnka Eine Frage, ist dieser letzte Schritt wirklich notwendig? Wenn ich Sie richtig verstanden habe, erkennt EF nur Änderungen an den bereits geladenen Datensätzen und führt sie auf den ersten Weg zusammen. Wenn Sie also manuell eine neue Zeile zu einer Tabelle hinzufügen würden, würde sie nicht auf den ersten Weg in dbcontext aktualisiert werden? Ich habe das gerade versucht und ich sah keine Notwendigkeit für den zweiten Weg. Vielleicht hat sich das Verhalten geändert oder ich habe dich völlig missverstanden? :) – DrCopyPaste