4 Stimmen

Entity Framework: Arbeiten mit abgetrennten und angehängten Objekten

Lassen Sie mich zunächst darlegen, was ich tun möchte. Angenommen, ich habe drei Arten von EntityObject , MetaData , Data1 et Data2 . MetaData ist, wie zu erwarten, ein Verweis auf jeweils eine Instanz von Data1 et Data2 . Nun, für jede MetaData kann ich eine value .

So weit, so einfach. Jetzt möchte ich, dass der Benutzer mit verschiedenen Kombinationen von Data1 et Data2 und sehen, was value s sie bekommen können. Dies erfordert natürlich die Erstellung von Instanzen von MetaData . Wenn ich nun die Datenbank nicht mit all diesen Einträgen überfrachten will MetaData dann möchte ich die Entitätsobjekte im In-Memory-Kontext erstellen, ohne eine SaveChanges() um sie in die DB zurückzuschreiben. Dies stellt jedoch ein Problem dar, denn immer wenn ich versuche, auf die Data1 et Data2 Referenzen der In-Memory MetaData Ich erhalte die folgende Ausnahme:

InvalidOperationException ist unbehandelt

Die Quellabfrage für diese EntityCollection oder EntityReference kann nicht zurückgegeben werden, wenn sich das zugehörige Objekt entweder in einem hinzugefügten Zustand oder in einem abgetrennten Zustand befindet und ursprünglich nicht mit der Zusammenführungsoption NoTracking abgerufen wurde.

Wenn ich wie vorgeschlagen vorgehe und das Objekt an die DB "übertrage", habe ich am Ende das Problem der Unordnung.

Jedenfalls sieht der schuldige Code etwa so aus:

MetaData temp = MetaData.CreateMetaData(0);

MetaData.Data1 = <existing Data1 from context>;
MetaData.Data2 = <existing Data2 from context>;

//Exception here
if (!MetaData.Data1Reference.isLoaded)
    MetaData.Data1Reference.Load();

Es scheint dieser Typ hatte ein ähnliches Problem.

11voto

Craig Stuntz Punkte 124703

IsLoaded ist nur für Eigenschaften von Instanzen relevant, die aus einer Datenbank materialisiert wurden. Wie Sie festgestellt haben, liefert es keine nützlichen Informationen für Instanzen, die nicht aus einer Datenbank materialisiert wurden.

Daher sollten Sie die Art und Weise ändern, wie Sie testen, ob Sie Load() aufrufen wollen oder nicht. Wenn Sie wissen, dass Sie mit Instanzen von MetaData arbeiten werden, die Sie nur im Speicher erstellt und nicht aus einer Datenbank materialisiert haben, dann könnten Sie Code wie diesen schreiben:

if ((temp.EntityState != System.Data.EntityState.Added) && 
    (!temp.Data1Reference.IsLoaded)) temp.Data1Reference.Load();

Ich übersehe hier einige Feinheiten. Zunächst einmal wird EntityState mit FlagsAttribute deklariert, kann also 含む Hinzugefügt ohne gleich zugefügt. Außerdem ist nichts von alledem notwendig, wenn Data1Reference nicht null ist, also sollten Sie vielleicht erst einmal darauf testen. Der Punkt ist, dass Sie Code schreiben können, der Ihrer Situation entspricht, aber er muss den gesamten Zustand von temp berücksichtigen, nicht nur seine Eigenschaften.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X