Entity Framework: Objekte kürzlich dem Kontext hinzugefügt hinzufügen

entity-framework

Frage

Ich benutze das Entity-Framework und habe ein Problem mit dem "Wiederfinden" von Objekten, die ich gerade 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, dass der Code übrigens funktioniert - alles hängt von meinem Kopf ab)

Warum "findet" die Abfrage das soeben erstellte EntityObject nicht?

Wenn ich nach dem AddToEntityObject SaveChanges () aufrufe, funktioniert es (was mich nicht überrascht), aber warum wird es nicht ordnungsgemäß aus dem Cache gezogen?

Ich bin immer noch grün in diesem Zeug, also hoffe ich, dass es etwas wirklich einfaches gibt, was ich einfach übersehe ...

Vielen Dank

Akzeptierte Antwort

Dies geschieht, weil ents.EntityObject.WhatEver immer die Datenquelle abfragt. Dies ist eine Designentscheidung. Sie tun dies auf diese Weise, weil sie die Abfrage sonst für die Datenquelle, für den lokalen Cache ausführen und dann die Ergebnisse zusammenführen müssen. Wie einer der Entwickler in einem Blog feststellte (kann sich nicht genau erinnern, wo genau), konnten sie damit nicht konsequent umgehen.

Wie Sie sich vorstellen können, gibt es viele Ecken und Kanten, die Sie richtig behandeln müssen. Sie könnten einfach eine von Ihnen in der Datenbank erstellte ID lokal finden, die von einer anderen Person erstellt wurde. Dies würde Sie zwingen, Konflikte bei (fast) jeder Abfrage zu bewältigen. Vielleicht hätten sie Methoden zum Abfragen des lokalen Cache und Methoden zum Abfragen der Datenquelle erstellen können, aber das ist auch nicht schlau.

Sie können einen Blick auf Transparent Lazy Loading für Entity Framework werfen. Dadurch wird der normale Codegenerator ersetzt, und Sie erhalten Entitäten, die ihre zugehörigen Entitätssammlungen und Entitätsverweise beim Zugriff automatisch auffüllen. Dies vermeidet alle

if (!Entity.ReleatedEntities.IsLoaded)
{
   Entity.RelatedEntities.Load();
}

Codefragmente. Sie können die Sammlungen abfragen, da sie immer implizit geladen werden. Aber auch diese Lösung ist nicht perfekt. Es gibt einige Probleme. Wenn Sie beispielsweise eine neue Entität erstellen und auf eine Sammlung verwandter Entitäten zugreifen, wird eine Ausnahme angezeigt, da der Code die verwandten Entitäten nicht aus der Datenbank abrufen kann. Es gibt auch ein Problem bezüglich der Datenbindung, und möglicherweise ist mir noch etwas anderes bekannt.

Das Gute ist, dass Sie den Quellcode bekommen und in der Lage sind, die Probleme selbst zu beheben, und ich werde das erste Problem prüfen, wenn ich etwas Zeit finde. Aber ich bin mir ziemlich sicher, dass es nicht so einfach zu beheben sein wird, da ich davon ausgehe, dass einige Fälle die Datenbank nicht treffen würden, wenn die Entität nur erstellt wurde und nicht das erwartete Verhalten ist.


Beliebte Antwort

Das neu hinzugefügte Objekt befindet sich in der lokalen Datenquelle, da es noch nicht in der Datenbank gespeichert ist. Sie können also EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId) ?? ents.EntityObject.Local.FirstOrDefault(o => o.Id == theId);



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum