Entity Framework: Arbeiten mit freistehenden und angehängten Objekten

c# entity-framework

Frage

Lassen Sie mich zunächst erklären, was ich gerne tun würde. Angenommen, ich habe drei Arten von EntityObject , MetaData , Data1 und Data2 . MetaData hat, wie zu erwarten war, jeweils einen Verweis auf jeweils eine Instanz von Data1 und Data2 . Nun kann ich für jede MetaData einen value berechnen.

So weit so einfach. Nun möchte ich, dass der Benutzer mit verschiedenen Kombinationen von Data1 und Data2 Data1 und Data2 , welche value kann. Dies erfordert natürlich die Erstellung von Instanzen von MetaData . Wenn ich nun die Datenbank nicht mit all diesen MetaData Einträgen bündeln möchte, möchte ich die Entitätsobjekte im Kontext des Arbeitsspeichers erstellen, ohne ein SaveChanges() , um sie in die SaveChanges() zurückzuschreiben. Dies stellt jedoch Data1 ein Problem dar, als ich versuche, auf die Data1 und Data2 Referenzen der Data2 im Arbeitsspeicher MetaData , die folgende Ausnahme Data2 :

InvalidOperationException wird nicht behandelt

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 getrennten Zustand befindet und ursprünglich nicht mit der NoTracking-Zusammenführungsoption abgerufen wurde.

Wenn ich wie vorgeschlagen vorgehe und das Objekt in die DB "übergebe", ende ich mit dem Durcheinander-Problem.

Der schuldige Code sieht jedoch ungefähr 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, dass dieser Typ ein ähnliches Problem hatte.

Akzeptierte Antwort

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

Daher sollten Sie die Art und Weise ändern, in der Sie testen, ob Sie Load () aufrufen möchten. Wenn Sie wissen, dass Sie mit Instanzen von MetaData arbeiten, die Sie nur im Speicher erstellt und nicht aus einer Datenbank erstellt haben, können Sie folgenden Code schreiben:

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

Ich beschönige hier einige Feinheiten. Für den Anfang wird EntityState mit Flags erklärt, so dass er hinzugefügt , ohne gleich hinzugefügt enthalten. Dies ist auch nicht erforderlich, wenn Data1Reference nicht Null ist. Daher möchten Sie vielleicht zuerst das testen. Der Punkt ist, Sie können Code schreiben, der zu Ihrer Situation passt, aber er muss den vollständigen Zustand der Temperatur berücksichtigen, nicht nur ihre Eigenschaften.



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