Share via


Anfügen und Trennen von Objekten (Entity Framework)

Im Entity Framework können Objekte einem Objektkontext angefügt oder davon getrennt werden. Objekte, die an einen Objektkontext angefügt werden, werden von diesem Objektkontext verfolgt und verwaltet. Der Objektkontext verweist nicht auf getrennte Objekte, und ihre Ressourcen können vom .NET Framework wieder verwendet werden. In diesem Thema wird beschrieben, wie Objekte einem Objektkontext angefügt und davon getrennt werden. Außerdem wird auf Punkte eingegangen, die hierbei zu berücksichtigen sind.

Anfügen von Objekten

Beim Ausführen einer Abfrage innerhalb eines Objektkontexts im Entity Framework werden die zurückgegebenen Objekte automatisch an den Objektkontext angefügt. Es können auch Objekte an einen Objektkontext angefügt werden, die nicht von einer Abfrage stammen. Es können Objekte angefügt werden, die zuvor getrennt waren, sowie Objekte, die von einer NoTracking-Abfrage zurückgegeben wurden oder die außerhalb des Objektkontexts abgerufen wurden. Sie haben außerdem die Möglichkeit Objekte anzufügen, die im Ansichtsstatus einer ASP.NET-Anwendung gespeichert oder vom Aufruf einer Remotemethode oder einem Webdienst zurückgegeben wurden.

Verwenden Sie eine der folgenden Methoden, um das Objekt an einen Objektkontext anzufügen:

Element Beschreibung

System.Data.Objects.ObjectSet.AddObject(

oder

System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)

Fügt dem ObjectContext ein Objekt und die mit ihm verbundenen Objekte hinzu und legt die Entitätsobjekte auf den Zustand Added fest. In diesem Zustand müssen die Entitätsobjekte keine eindeutigen Schlüsselwerte besitzen. Den Schlüsseleigenschaften werden temporäre Schlüsselwerte zugewiesen und sie werden mit den aus der Datenquelle generierten Werten aktualisiert, sobald die Objekte gespeichert werden. Nachdem Sie die Objekte hinzugefügt haben, ändern Sie den Zustand der Entitätsobjekte entsprechend ab.

System.Data.Objects.ObjectSet.Attach(

oder

System.Data.Objects.ObjectContext.Attach(System.Data.Objects.DataClasses.IEntityWithKey)

und

AttachTo

Fügt ObjectContext ein neues Objekt hinzu und versetzt das Objekt in den Zustand Unchanged. Im Zustand Unchanged behandelt Entity Framework die Entitätsschlüsselwerte als endgültig. Wenn mehr als eine Entität eines bestimmten Typs über den gleichen Schlüsselwert verfügt, löst Entity Framework eine Ausnahme aus. Verwenden Sie die AddObject-Methode, um die getrennten Objekte anzufügen und dann deren Zustand angemessen zu ändern, um diese Ausnahme zu vermeiden.

Objekte werden im Unchanged-Status an den Objektkontext angefügt. Wenn Sie den Zustand eines Objekts oder die Beziehung ändern müssen, weil Sie wissen, dass das Objekt geändert wurde, während es vom Objektkontext getrennt war, verwenden Sie eine der folgenden Methoden.

Element Beschreibung

ChangeObjectState

Legt für eine Entität oder eine Beziehung einen neuen Zustand (z. B. Added oder Modified) fest. Diese Änderung hat möglicherweise Auswirkungen auf die Beziehungen, an denen eine Entität beteiligt ist. Wird zum Beispiel eine Entität in den Zustand Added versetzt, werden auch alle unveränderten Beziehungen in den Zustand Added versetzt. Ähnliches gilt, wenn eine Entität als Modified markiert wird, denn dann werden alle skalaren Werte als Modified markiert.

Sie können auch die ChangeState-Methode von ObjectStateEntry verwenden.

ChangeRelationshipState

Legt für die vorhandene Beziehung zwischen zwei Entitäten den angegebenen Zustand fest. Wenn es keine Beziehung zwischen den Entitäten gibt, erstellt diese Methode eine neue im angegebenen Zustand. Diese Methode wird nicht für Beziehungen unterstützt, die auf einer Fremdschlüsselzuordnung basieren. Weitere Informationen finden Sie unter Definieren und Verwalten von Beziehungen (Entity Framework).

Sie können auch die ChangeObjectState-Methode von ObjectStateEntry verwenden.

ChangeState

Diese Methode verhält sich wie ChangeObjectState oder ChangeRelationshipState, abhängig davon, ob ObjectStateEntry ein Objekt oder eine Beziehung ist.

SetModifiedProperty

Legt die einzelnen Eigenschaften auf den Zustand Modified fest. Verwenden Sie diese Methode, wenn Sie wissen, welche Eigenschaften geändert wurden, statt die gesamte Entität als geändert zu markieren.

Wenn das Objekt, das angefügt wird, Eigenschaftswerte aktualisiert hat, verwenden Sie eine der folgenden Methoden:

Element Beschreibung

System.Data.Objects.ObjectSet.ApplyCurrentValues(

oder

System.Data.Objects.ObjectContext.ApplyCurrentValues.String,

Kopiert die skalaren Werte aus dem angegebenen Objekt in das Objekt im ObjectContext, der über den gleichen Schlüssel verfügt. Alle Werte, die sich von den ursprünglichen Werten unterscheiden, werden als geändert markiert.

Wenn Sie ein Diagramm mit aktuellen Werten haben und die ursprünglichen Werte übernehmen möchten, rufen Sie die ApplyOriginalValues-Methode auf.

Sie können auch die ApplyCurrentValues-Methode von ObjectStateEntry verwenden.

System.Data.Objects.ObjectSet.ApplyOriginalValues(

oder

System.Data.Objects.ObjectContext.ApplyOriginalValues.String,

Kopiert die skalaren Werte aus dem angegebenen Objekt in den Satz der ursprünglichen Werte des Objekts im ObjectContext, der über den gleichen Schlüssel verfügt. Alle Werte, die sich von den aktuellen Werten unterscheiden, werden als geändert markiert.

Sie können auch die ApplyOriginalValues-Methode von ObjectStateEntry verwenden.

SetModifiedProperty

Legt die einzelnen Eigenschaften auf den Zustand Modified fest. Verwenden Sie diese Eigenschaft, wenn Sie wissen, welche Eigenschaften geändert wurden, statt die gesamte Entität als geändert zu markieren.

GetUpdatableOriginalValues

Ruft die OriginalValueRecord-Instanz ab, die die aktualisierbare Version der ursprünglichen Werte des Objekts darstellt, das diesem ObjectStateEntry zugeordnet ist. Verwenden Sie die zurückgegebene OriginalValueRecord-Instanz, um die ursprünglichen Eigenschaften des Objekts einzeln zu lesen oder zu aktualisieren.

CurrentValues

Ruft die CurrentValueRecord-Instanz ab, die die aktuellen Werte des Objekts darstellt, das diesem ObjectStateEntry zugeordnet ist. Verwenden Sie die zurückgegebene CurrentValueRecord-Instanz, um die aktuellen Eigenschaften des Objekts einzeln zu lesen oder zu aktualisieren.

Überlegungen zum Anfügen von Objekten

Folgendes gilt beim Anfügen von Objekten an den Objektkontext:

  • Wenn das anzufügende Objekt über verbundene Objekte verfügt, werden auch diese Objekte an den Objektkontext angefügt.

  • Wenn das angefügte Objekt nicht in der Datenquelle vorhanden ist, wird es beim Ausführen von SaveChanges nicht hinzugefügt. In diesem Fall tritt eine Ausnahme auf dem Server auf, wenn Eigenschaften geändert wurden und SaveChanges ausgeführt wird. Verwenden Sie System.Data.Objects.ObjectSet.AddObject( oder System.Data.Objects.ObjectContext.AddObject(System.String,System.Object), um ein Objekt hinzuzufügen.

    Wenn das anzufügende Objekt mit anderen Objekten verbunden ist, müssen die Beziehungen auf eine der folgenden Arten, die im Thema Definieren und Verwalten von Beziehungen (Entity Framework) beschrieben werden, explizit definiert werden. Weitere Informationen finden Sie unter Gewusst wie: Anfügen verbundener Objekte (Entity Framework).

  • Das Objekt, das an die Attach-Methode übergeben wird, muss über einen gültigen EntityKey-Wert verfügen. Wenn das Objekt keinen gültigen EntityKey-Wert aufweist, geben Sie den Namen des Entitätssatzes mit der AttachTo-Methode an.

  • Eine InvalidOperationException tritt auf, wenn ein anzufügendes Objekt über denselben EntityKey verfügt wie ein anderes, bereits im Objektkontext vorhandenes Objekt. Dieser Fehler tritt nicht auf, wenn im Kontext ein Objekt mit gleichem Schlüssel, jedoch im Zustand Added vorhanden ist.

Trennen von Objekten

In Entity Framework -Anwendungen können Sie Objekte vom Objektkontext trennen. Sie könnten Objekte trennen, um Ressourcen zu sparen, da das Ausführen wiederholter Abfragen im gleichen Objektkontext die Arbeitsspeicheranforderungen des Objektkontexts erhöht. Sie können verhindern, dass Objekte dem Objektkontext angefügt zu werden, indem Sie eine Abfrage mit dem MergeOption-Wert NoTracking ausführen. Sie können Objekte auch trennen, indem Sie die System.Data.Objects.ObjectSet.Detach(-Methode oder die System.Data.Objects.ObjectContext.Detach(System.Object)-Methode aufrufen und wie im folgende Beispiel einen Verweis auf das Objekt übergeben, das getrennt werden soll:

' Detach the first SalesOrderDetail in the collection. 
context.Detach(order.SalesOrderDetails.First())
// Detach the first SalesOrderDetail in the collection.
context.Detach(order.SalesOrderDetails.First());

Überlegungen zum Trennen von Objekten

Beim Trennen von Objekten ist Folgendes zu berücksichtigen:

  • Detach betrifft nur das jeweilige Objekt, das an die Methode übergeben wird. Wenn das zu trennende Objekt über verbundene Objekte im Objektkontext verfügt, werden diese Objekte nicht getrennt.

  • In einer unabhängigen Zuordnung werden die Beziehungsinformationen für getrennte Objekte nicht verwaltet.

  • Objektzustandsinformationen bleiben nicht erhalten, wenn ein Objekt getrennt wird. Dies schließt nachverfolgte Änderungen und temporäre Schlüsselwerte ein.

  • Das Trennen von Objekten wirkt sich nicht auf Daten in der Datenquelle aus.

  • Während eines Trennvorgangs werden keine Direktiven zur kaskadierten Löschung oder referenziellen Einschränkungen in einer identifizierenden Beziehung erzwungen.

  • Die Vorteile der Objekttrennung sollten gegen den zusätzlichen Verarbeitungsaufwand abgewogen werden. Wenn sich der Bereich der Benutzerdaten geändert hat, beispielsweise wenn ein neues Formular mit anderen Daten angezeigt wird, sollten Sie besser eine neue ObjectContext-Instanz erstellen, statt lediglich Objekte von einem vorhandenen ObjectContext zu trennen.

Weitere Informationen finden Sie unter Gewusst wie: Trennen von Objekten aus einem Objektkontext (Entity Framework).

In diesem Abschnitt

Gewusst wie: Anfügen verbundener Objekte (Entity Framework)

Gewusst wie: Übernehmen von an einem getrennten Objekt vorgenommenen Änderungen (Entity Framework)

Gewusst wie: Trennen von Objekten aus einem Objektkontext (Entity Framework)

Siehe auch

Konzepte

Erstellen von N-Tier-Anwendungen (Entity Framework)