Arbeiten mit Entitäten mit Selbstnachverfolgung

In einer Entity Framework -Anwendung ist der Objektkontext für das Verfolgen von Änderungen in den Entitäten eines Objektdiagramms zuständig. Allerdings steht der Objektkontext in n-Ebenen-Szenarien möglicherweise nicht auf der Ebene zur Verfügung, auf der die Entitäten geändert werden. Ab Version 4 von .NET Framework können Entitäten mit Selbstnachverfolgung Ihnen helfen, Änderungen in jeder Ebene nachzuverfolgen.

Ff407090.note(de-de,VS.100).gifHinweis:
Verwenden Sie Entitäten mit Selbstnachverfolgung nur dann, wenn der Objektkontext auf einer Ebene nicht verfügbar ist, auf der die Änderungen am Objektdiagramm vorgenommen werden. Verwenden Sie abgeleitete EntityObject-Typen, POCO (plain-old CLR object)-Typen oder POCO-Proxytypen, wenn der Objektkontext verfügbar ist. Weitere Informationen finden Sie unter Arbeiten mit Objekten (Entity Framework).

Ab Microsoft Visual Studio 2010 generiert die Vorlage ADO.NET-Entitäts-Generator mit Selbstnachverfolgung Entitäten mit Selbstnachverfolgung. Dieses Vorlagenelement generiert zwei TT-Dateien (Textvorlagen): <Modellname>.tt und <Modellname>.Context.tt. Mit der Datei <Modellname>.tt werden die Entitätstypen und eine Hilfsklasse generiert, die zum Einen die Änderungsnachverfolgungslogik enthalten, die von Entitäten mit Selbstnachverfolgung verwenden wird, zum Anderen die Erweiterungsmethoden, mit denen der Status von Entitäten mit Selbstnachverfolgung festgelegt werden kann. Mit der Datei <Modellname>.Context.tt wird ein typisierter ObjectContext und eine Erweiterungsklasse erstellt, die die ApplyChanges-Methoden für die ObjectContext-Klasse und die ObjectSet-Klasse enthält. Diese Methoden untersuchen die Änderungsnachverfolgungsinformationen, die im Diagramm der Entitäten mit Selbstnachverfolgung enthalten sind, um die Vorgänge abzuleiten, die ausgeführt werden müssen, um die Änderungen in der Datenbank zu speichern. Weitere Informationen finden Sie unter ADO.NET Self-Tracking Entity Generator Template.

Ff407090.Important(de-de,VS.100).gif Hinweis:
Ein Dienst sollte Anforderungen nicht vertrauen, Daten von einem nicht vertrauenswürdigen Client oder über einen nicht vertrauenswürdigen Kanal abzurufen oder zu aktualisieren. Ein Client muss authentifiziert werden: Es sollte ein sicherer Kanal oder ein Nachrichtenumschlag verwendet werden. Clientanforderungen zum Aktualisieren oder Abrufen von Daten müssen überprüft werden, um sicherzustellen, dass sie den erwarteten und ordnungsgemäßen Änderungen für das jeweilige Szenario entsprechen.

Ff407090.Important(de-de,VS.100).gif Hinweis:
Vertrauliche Informationen sollten nicht als Entitätsschlüssel verwendet werden (z. B. Sozialversicherungsnummern). Auf diese Weise wird das Risiko verringert, versehentlich vertrauliche Informationen in den Entitätsdiagrammen mit Selbstnachverfolgung für einen nicht vollständig vertrauenswürdigen Client zu serialisieren. Bei unabhängigen Zuordnungen kann zudem der ursprüngliche Schlüssel einer Entität an den Client gesendet werden, der sich auf den zu serialisierenden Schlüssel bezieht.

Erweiterungsmethoden für Entitäten mit Selbstnachverfolgung

Die folgenden Erweiterungsmethoden können für Entitäten mit Selbstnachverfolgung verwendet werden. Wenn Sie diese Vorgänge für einen Satz von Entitäten statt nur für eine Entität ausführen möchten, finden Sie weitere Informationen unter Working with Sets of Self-Tracking Entities.

StartTracking-Methode

Die StartTracking-Methode weist die Änderungsnachverfolgung für die Entität an, mit der Aufzeichnung aller an der Entität vorgenommenen Änderungen zu beginnen. Dies umfasst Änderungen an skalaren Eigenschaften, Auflistungen und Verweisen zu anderen Entitäten. Die Entitäten mit Selbstnachverfolgung beginnen die Nachverfolgung automatisch, wenn sie über Windows Communication Foundation (WCF) auf dem Client deserialisiert wurden. Die Nachverfolgung wird in den folgenden Szenarien zudem für neu erstellte Entitäten aktiviert:

  • Wenn eine Beziehung zwischen der neuen Entität und einer Entität erstellt wird, die bereits Änderungen nachverfolgt.

  • Wenn die MarkAs[State]-Methode oder die AcceptChanges-Methode für eine Entität aufgerufen wird.

StopTracking-Methode

Die StopTracking-Methode beendet das Aufzeichnen von Änderungen.

MarkAs-Methoden

Alle MarkAs-Methoden aktivieren die Nachverfolgung. Diese Erweiterungsmethoden vereinfachen das explizite Ändern des Status einer Entität in Deleted, Unchanged, Added und Modified.

Die MarkAs[State]-Methoden geben die gleiche Entität mit dem geänderten Status zurück, für die sie angewendet werden. Im folgenden Beispiel wird der Status der Entität in Unchanged geändert:

department.Course = new Course { CourseID = courseID }.MarkAsUnchanged();

Mit der MarkAsAdded-Methode wird der Status der Entität in Added geändert. Neue Entitäten mit Selbstnachverfolgung werden im Status Added erstellt, wenn die Änderungsnachverfolgung nicht aktiviert wurde.

Mit der MarkAsDeleted-Methode wird der Status der Entität in Deleted geändert. Diese Methode löscht auch die Navigationseigenschaften für die Entität, die zum Löschen markiert ist. Die Navigationseigenschaft wird auf NULL festgelegt, wenn sie auf ein Verweisobjekt zeigt. Die Clear-Methode wird aufgerufen, wenn die Navigationseigenschaft eine Auflistung darstellt. Wenn MarkAsDeleted für ein Objekt aufgerufen wird, das Teil einer Auflistung ist, wird das Objekt aus der Auflistung entfernt. Um jedes Objekt in einer Auflistung als gelöscht zu markieren, markieren Sie die Objekte in einer Kopie der Auflistung. Um die Kopie der Auflistung abzurufen, rufen Sie die ToArray()-Methode oder ToList()-Methode für die Auflistung auf, wie im folgenden Beispiel dargestellt:

List<Course> courses = department.Courses.ToList();

foreach (var c in courses)

{

// Mark each course in the department as Deleted.

c.MarkAsDeleted();

}

Mit der MarkAsModified-Methode wird der Status der Entität in Modified geändert. Auch beim Ändern eines Eigenschaftswerts einer Entität, deren Änderungsnachverfolgung aktiviert ist, wird der Status auf Modified festgelegt.

Mit der MarkAsUnchanged-Methode wird der Status der Entität in Unchanged geändert. Zudem löscht AcceptChanges die Informationen der Änderungsnachverfolgung einer Entität und ändert deren Status zu Unchanged.

AcceptChanges

Mit der AcceptChanges-Methode werden die Informationen der Änderungsnachverfolgung für eine Entität gelöscht und deren Status in Unchanged geändert. Wenn der Status einer Beziehung zurückgesetzt werden soll, rufen Sie für beide Entitäten der Beziehung AcceptChanges auf.

ObjectContext-Erweiterungsmethoden

Die ApplyChanges-Methode untersucht die Informationen der Änderungsnachverfolgung im Diagramm der Entitäten mit Selbstnachverfolgung und leitet die Vorgänge ab, die ausgeführt werden müssen, um die Änderungen in der Datenbank zu aktualisieren. Es gibt zwei ApplyChanges-Methoden: eine für den ObjectContext und die andere für die ObjectSet.

Ff407090.note(de-de,VS.100).gifHinweis:
Um die Weitergabe von Ausnahmemeldungen mit vertraulichen Daten auf Clientebene zu verhindern, sollten Aufrufe von ApplyChanges und SaveChanges auf Serverebene von Ausnahmebehandlungscode umschlossen sein.

Überlegungen für die Verwendung von Entitäten mit Selbstnachverfolgung

Beachten Sie bei der Verwendung von Entitäten mit Selbstnachverfolgung Folgendes:

  • Stellen Sie sicher, dass das Clientprojekt einen Verweis auf die Assembly mit den Entitätstypen enthält. Wenn Sie dem Clientprojekt nur den Dienstverweis hinzufügen, verwendet das Clientprojekt die WCF-Proxytypen und nicht die tatsächlichen Entitätstypen mit Selbstnachverfolgung. Dies bedeutet, dass Sie nicht die automatisierten Benachrichtigungsfunktionen abrufen, die die Nachverfolgung der Entitäten auf dem Client verwalten. Wenn Sie die Entitätstypen absichtlich nicht einschließen möchten, müssen Sie Informationen der Änderungsnachverfolgung auf dem Client manuell festlegen, damit die Änderungen an den Dienst zurückgesendet werden.

  • Aufrufe des Dienstvorgangs sollten zustandslos sein und eine neue Instanz des Objektkontexts erstellen. Es wird auch empfohlen, Objektkontext in einem using-Block zu erstellen.

  • Wenn Sie das auf dem Client geänderte Diagramm an den Dienst senden und anschließend auf dem Client weiterhin dasselbe Diagramm verwenden möchten, müssen Sie das Diagramm auf dem Client manuell durchlaufen und die AcceptChanges-Methode für alle Objekte aufrufen, um die Änderungsnachverfolgung zurückzusetzen. Wenn Objekte im Diagramm Eigenschaften mit datenbankgenerierten Werten (z. B. Identitäts- oder Parallelitätswerte) enthalten, ersetzt Entity Framework Werte dieser Eigenschaften durch die datenbankgenerierten Werte, nachdem die SaveChanges-Methode aufgerufen wurde. Sie können den Dienstvorgang implementieren, um gespeicherte Objekte oder eine Liste generierter Eigenschaftenwerte für die Objekte an den Client zurückzugeben. Der Client müsste dann die Objektinstanzen oder Objekteigenschaftenwerte durch die vom Dienstvorgang zurückgegebenen Objekte oder Eigenschaftenwerte ersetzen.

  • Das Zusammenführen von Diagrammen aus mehreren Dienstanforderungen kann zu Objekten mit doppelten Schlüsselwerten im resultierenden Diagramm führen. Entity Framework entfernt die Objekte mit doppelten Schlüsseln nicht, wenn Sie die ApplyChanges-Methode aufrufen. Stattdessen wird eine Ausnahme ausgelöst. Um Diagramme mit doppelten Schlüsselwerten zu vermeiden, halten Sie sich an eines der im folgenden Blog beschriebenen Muster: Self-Tracking Entities: ApplyChanges and duplicate entities.

  • Wenn Sie die Beziehung zwischen Objekten durch Festlegen der Fremdschlüsseleigenschaft ändern, wird die Verweisnavigationseigenschaft auf NULL festgelegt und nicht mit der entsprechenden Prinzipalentität auf dem Client synchronisiert. Nachdem das Diagramm an den Objektkontext angefügt wurde (z. B. nach dem Aufrufen der ApplyChanges-Methode), werden die Fremdschlüsseleigenschaften und die Navigationseigenschaften synchronisiert.

    Die nicht erfolgte Synchronisierung einer Verweisnavigationseigenschaft mit dem entsprechenden Prinzipalobjekt kann ein Problem sein, wenn Sie die Löschweitergabe für die Fremdschlüsselbeziehung festgelegt haben. Wenn Sie das Prinzipalobjekt löschen, wird der Löschvorgang nicht an die abhängigen Objekte weitergegeben. Wenn Sie Löschweitergaben festgelegt haben, verwenden Sie Navigationseigenschaften zum Ändern der Beziehungen, statt die Fremdschlüsseleigenschaft festzulegen.

  • Mit Entitäten mit Selbstnachverfolgung kann kein Lazy Loading durchgeführt werden.

  • Die binäre Serialisierung sowie die Serialisierung in ASP.NET-Zustandsverwaltungsobjekte wird von aus der Vorlage ADO.NET-Entitäts-Generator mit Selbstnachverfolgung generiertem Code nicht unterstützt. Sie können jedoch die Vorlage anpassen, um die Unterstützung der binären Serialisierung hinzuzufügen. Weitere Informationen finden Sie unter Using Binary Serialization and ViewState with Self-Tracking Entities.

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Serialisieren von Entitäten mit Selbstnachverfolgung (Entity Framework)

Weitere Ressourcen

Working with Sets of Self-Tracking Entities
Self-Tracking Entities in Silverlight
Using Binary Serialization and ViewState with Self-Tracking Entities