Entity Framework: Wiederfinden von Objekten, die kürzlich dem Kontext hinzugefügt wurden
Ich bin mit dem entity framework und ich habe ein problem mit "neu-finden" Objekte, die ich erstellt habe... im Grunde geht es so:
string theId = "someId";
private void Test()
{
using(MyEntities entities = new MyEntities())
{
EntityObject o = new EntityObject();
o.Id = theId;
entities.AddToEntityObject(o);
CallSomeOtherMethod(entities);
}
}
void CallSomeOtherMethod(MyEntities ents)
{
EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId);
if(search == null)
{
Console.WriteLine("wha happened???");
}
}
(keine Garantie der code funktioniert btw - es ist alles aus meinem Kopf)
Warum nicht die Abfrage "finden" die EntityObject, die gerade erstellt wurde?
Wenn ich den Anruf SaveChanges() nach der AddToEntityObject es funktioniert (wundert mich nicht) aber warum nicht Sie ziehen Sie aus dem cache richtig?
Ich bin immer noch grün auf dieses Zeug so hoffe ich, dass es eine wirklich einfache Sache, ich bin nur mit Blick auf...
Dank
InformationsquelleAutor der Frage dovholuk | 2009-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies geschieht, weil die ents.EntityObject.Was auch immer Abfragen der Datenquelle. Dies ist eine design-Entscheidung. Sie tun es auf diese Art, denn sonst hätten Sie zum ausführen der Abfrage für die Datenquelle, gegen den lokalen cache und dann Zusammenführen der Ergebnisse. Als einer der Entwickler wies darauf hin, in einem blog (kann mich nicht mehr erinnern wo genau), Sie waren nicht in der Lage, dies zu behandeln konsequent.
Als Sie sich vorstellen können gibt es eine Menge von Ecke eine Kante Fällen müssen Sie handle richtig. Sie könnte einfach eine id, die Sie lokal erstellt, erstellt von jemand anderem in der Datenbank. Dies würde Sie zwingen, um vorbereitet zu sein für die Behandlung von Konflikten auf (fast) jede Anfrage. Sie vielleicht gemacht haben könnte, Methoden zum Abfragen des lokalen cache und die Methoden zur Abfrage der Datenquelle, aber das ist nicht smart, auch.
Können Sie einen Blick auf Transparentes Lazy-Loading für Entity Framework. Dies ersetzt die normale code-generator und Sie erhalten Personen, die das ausfüllen der zugehörigen Entität Sammlungen und entity-Referenzen automatisch auf Zugriff. Das vermeidet die
code-Fragmente. Und Sie können die Abfrage der Kollektionen, denn Sie sind immer implizit geladen. Aber diese Lösung ist nicht perfekt, auch. Es gibt einige Probleme. Zum Beispiel, wenn Sie erstellen eine neue Entität und den Zugriff auf eine Sammlung von verbundenen Unternehmen, erhalten Sie eine Ausnahme, weil der code ist nicht in der Lage zum abrufen der zugehörigen Entitäten aus der Datenbank. Es ist auch ein Problem in der Daten-Bindung und möglicherweise einige mehr bin ich nicht bewusst.
Die gute Sache ist, dass du den source-code und sind in der Lage, die Probleme beheben, die sich selbst, und ich werde prüfen, ob das erste Problem, wenn ich etwas Zeit. Aber ich bin mir ziemlich sicher, dass es nicht so einfach zu lösen, weil ich erwarte, dass einige waren einfach nicht zu schlagen, die Datenbank, wenn die Entität, die gerade erstellt wurde, ist nicht das erwartete Verhalten.
InformationsquelleAutor der Antwort Daniel Brückner
das neu hinzugefügte Objekt wird in der lokalen Datenquelle als es ist nicht persistent in der Datenbank noch
so können Sie sagen,
EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId) ??
ents.EntityObject.Local.FirstOrDefault(o => o.Id == theId);
InformationsquelleAutor der Antwort abdelrady
War ich in der gleichen situation. Ich schrieb diese Erweiterung-Methode, die zumindest für mich das problem löst (ich habe keine Probleme mit ich.e Konflikte in meinem Kontext...)
InformationsquelleAutor der Antwort Jan Christenson
Den extension-Methode Balg ist DbSet<>
Wie zu verwenden:
btw: ich Liebe Generika!
InformationsquelleAutor der Antwort Alexandre
Ich habe vor kurzem kämpfte mit der gleichen Frage. Ich bin dieses posting eine Antwort 2 Jahre nach der Frage gefragt wurde, in der Hoffnung, dass dieses Stück code, kann jemand helfen auf der Suche nach einer Antwort.
Ich habe im Grunde implementiert eine extension-Methode (wie vorgeschlagen von Alex James) namens "Suchen", die funktioniert in der gleichen Weise, dass, "Wo", sondern "Finden" prüft auch die ObjectContext, um zu sehen, ob es irgendwelche Zusätzlichen Entitäten, die Erfüllung der gegebenen Prädikat. Dies ermöglicht es Ihnen, zu finden, eine Entität, auch wenn es noch nicht auf der Datenbank gespeichert noch.
Finden, gibt ein IQueryable(of T), so dass Sie können es verwenden, wie jede andere LINQ-Betreiber.
InformationsquelleAutor der Antwort Casey Wilkins
Haben Sie eine Reihe von Optionen. Sie könnten erweitern die
ObjectContext
mit einem anderen partiellen Klasse, um Ihren eigenen Mechanismus für das abrufen von kürzlich Hinzugefügten Informationen.Oder Sie könnten gerade ein extension-Methode auf die
ObjectContext
sieht durch dieObjectContext.ObjectStateManager
Suche nach 'Hinzugefügt'ObjectStateEntries
und dann verwenden Sie LINQ, um Objekte zu finden, was Sie suchen.InformationsquelleAutor der Antwort Alex James