Entitäten mit SelbstnachverfolgungSelf-tracking entities

Wichtig

Es wird nicht mehr empfohlen, die Vorlage für Entitäten mit Selbstnachverfolgung zu verwenden.We no longer recommend using the self-tracking-entities template. Die Vorlage ist nur für die Unterstützung vorhandener Anwendungen weiterhin verfügbar.It will only continue to be available to support existing applications. Wenn für Ihre Anwendung die Arbeit mit getrennten Diagrammen von Entitäten erforderlich ist, sollten Sie daher Alternativen erwägen, wie z.B. nachverfolgbare Entitäten. Diese Technologie ähnelt den Entitäten mit Selbstnachverfolgung und wird von der Community aktiver entwickelt. Alternativ dazu können Sie auch benutzerdefinierten Code mithilfe von APIs auf niedriger Ebene zur Änderungsnachverfolgung schreiben.If your application requires working with disconnected graphs of entities, consider other alternatives such as Trackable Entities, which is a technology similar to Self-Tracking-Entities that is more actively developed by the community, or writing custom code using the low-level change tracking APIs.

In einer auf Entity Framework basierenden Anwendung ist ein Kontext für das Nachverfolgen von Änderungen in den Objekten zuständig.In an Entity Framework-based application, a context is responsible for tracking changes in your objects. Verwenden Sie anschließend zum Speichern der Änderungen in der Datenbank die SaveChanges-Methode.You then use the SaveChanges method to persist the changes to the database. Bei der Arbeit mit N-schichtigen Anwendungen wird die Verbindung der Entitätsobjekte zum Kontext in der Regel getrennt. Sie müssen dann entscheiden, wie Änderungen nachverfolgt und an den Kontext zurückgemeldet werden.When working with N-Tier applications, the entity objects are usually disconnected from the context and you must decide how to track changes and report those changes back to the context. Mithilfe von Entitäten mit Selbstnachverfolgung (Self-Tracking Entities, STEs) können Sie Änderungen in jeder Ebene nachverfolgen und anschließend zur Speicherung in einem Kontext wiedergeben.Self-Tracking Entities (STEs) can help you track changes in any tier and then replay these changes into a context to be saved.

Verwenden Sie STEs nur dann, wenn der Kontext auf einer Ebene, auf der die Änderungen am Objektdiagramm vorgenommen werden, nicht verfügbar ist.Use STEs only if the context is not available on a tier where the changes to the object graph are made. Wenn der Kontext jedoch verfügbar ist, ist die Verwendung von STEs nicht notwendig, da der Kontext selbst Änderungsnachverfolgungen vornimmt.If the context is available, there is no need to use STEs because the context will take care of tracking changes.

Dieses Vorlagenelement generiert zwei TT-Dateien (Textvorlagen):This template item generates two .tt (text template) files:

  • Mit der Datei <model name>.tt werden die Entitätstypen und eine Hilfsklasse generiert, die die Logik zur Änderungsnachverfolgung enthält, die von Entitäten mit Selbstnachverfolgung verwendet wird. Zudem enthält sie die Erweiterungsmethoden, mit denen der Status von Entitäten mit Selbstnachverfolgung festgelegt werden kann.The <model name>.tt file generates the entity types and a helper class that contains the change-tracking logic that is used by self-tracking entities and the extension methods that allow setting state on self-tracking entities.
  • Mit der Datei <model name>.Context.tt werden ein abgeleiteter Kontext und eine Erweiterungsklasse generiert, die ApplyChanges-Methoden für die Klassen ObjectContext und ObjectSet enthält.The <model name>.Context.tt file generates a derived context and an extension class that contains ApplyChanges methods for the ObjectContext and ObjectSet classes. 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.These methods examine the change-tracking information that is contained in the graph of self-tracking entities to infer the set of operations that must be performed to save the changes in the database.

Erste SchritteGet Started

Informationen zu den ersten Schritten finden Sie auf der Seite Self-Tracking Entities Walkthrough (Exemplarische Vorgehensweise zu Entitäten mit Selbstnachverfolgung).To get started, visit the Self-Tracking Entities Walkthrough page.

Funktionale Überlegungen für die Verwendung von Entitäten mit SelbstnachverfolgungFunctional Considerations When Working with Self-Tracking Entities

Wichtig

Es wird nicht mehr empfohlen, die Vorlage für Entitäten mit Selbstnachverfolgung zu verwenden.We no longer recommend using the self-tracking-entities template. Die Vorlage ist nur für die Unterstützung vorhandener Anwendungen weiterhin verfügbar.It will only continue to be available to support existing applications. Wenn für Ihre Anwendung die Arbeit mit getrennten Diagrammen von Entitäten erforderlich ist, sollten Sie daher Alternativen erwägen, wie z.B. nachverfolgbare Entitäten. Diese Technologie ähnelt den Entitäten mit Selbstnachverfolgung und wird von der Community aktiver entwickelt. Alternativ dazu können Sie auch benutzerdefinierten Code mithilfe von APIs auf niedriger Ebene zur Änderungsnachverfolgung schreiben.If your application requires working with disconnected graphs of entities, consider other alternatives such as Trackable Entities, which is a technology similar to Self-Tracking-Entities that is more actively developed by the community, or writing custom code using the low-level change tracking APIs.

Beachten Sie bei der Verwendung von Entitäten mit Selbstnachverfolgung Folgendes:Consider the following when working with self-tracking entities:

  • Stellen Sie sicher, dass das Clientprojekt einen Verweis auf die Assembly mit den Entitätstypen enthält.Make sure that your client project has a reference to the assembly containing the entity types. Wenn Sie dem Clientprojekt nur den Dienstverweis hinzufügen, verwendet das Clientprojekt die WCF-Proxytypen und nicht die tatsächlichen Entitätstypen mit Selbstnachverfolgung.If you add only the service reference to the client project, the client project will use the WCF proxy types and not the actual self-tracking entity types. Dies bedeutet, dass Sie nicht die automatisierten Benachrichtigungsfunktionen abrufen, die die Nachverfolgung der Entitäten auf dem Client verwalten.This means that you will not get the automated notification features that manage the tracking of the entities on the client. 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.If you intentionally do not want to include the entity types, you will have to manually set change-tracking information on the client for the changes to be sent back to the service.

  • Aufrufe des Dienstvorgangs sollten zustandslos sein und eine neue Instanz des Objektkontexts erstellen.Calls to the service operation should be stateless and create a new instance of object context. Es wird auch empfohlen, Objektkontext in einem Using-Block zu erstellen.We also recommend that you create object context in a using block.

  • 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.When you send the graph that was modified on the client to the service and then intend to continue working with the same graph on the client, you have to manually iterate through the graph and call the AcceptChanges method on each object to reset the change tracker.

    Wenn Objekte im Diagramm Eigenschaften mit datenbankgenerierten Werten (z.B. Identitäts- oder Parallelitätswerte) enthalten, ersetzt Entity Framework die Werte dieser Eigenschaften durch die datenbankgenerierten Werte, nachdem die SaveChanges-Methode aufgerufen wurde.If objects in your graph contain properties with database-generated values (for example, identity or concurrency values), Entity Framework will replace values of these properties with the database-generated values after the SaveChanges method is called. Sie können den Dienstvorgang implementieren, um gespeicherte Objekte oder eine Liste generierter Eigenschaftenwerte für die Objekte an den Client zurückzugeben.You can implement your service operation to return saved objects or a list of generated property values for the objects back to the client. Der Client müsste dann die Objektinstanzen oder Objekteigenschaftenwerte durch die vom Dienstvorgang zurückgegebenen Objekte oder Eigenschaftenwerte ersetzen.The client would then need to replace the object instances or object property values with the objects or property values returned from the service operation.

  • Das Zusammenführen von Diagrammen aus mehreren Dienstanforderungen kann zu Objekten mit doppelten Schlüsselwerten im resultierenden Diagramm führen.Merging graphs from multiple service requests may introduce objects with duplicate key values in the resulting graph. Entity Framework entfernt die Objekte mit doppelten Schlüsseln nicht, wenn Sie die ApplyChanges-Methode aufrufen. Stattdessen wird eine Ausnahme ausgelöst.Entity Framework does not remove the objects with duplicate keys when you call the ApplyChanges method but instead throws an exception. Halten Sie sich zur Vermeidung von Diagrammen mit doppelten Schlüsselwerten an eines der im folgenden Blog beschriebenen Muster: Self-Tracking Entities: ApplyChanges and duplicate entities (Entitäten mit Selbstnachverfolgung: ApplyChanges und doppelte Entitäten).To avoid having graphs with duplicate key values follow one of the patterns described in the following blog: 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.When you change the relationship between objects by setting the foreign key property, the reference navigation property is set to null and not synchronized to the appropriate principal entity on the client. Nachdem das Diagramm an den Objektkontext angefügt wurde (z.B. nach dem Aufrufen der ApplyChanges-Methode), werden die Fremdschlüssel- und Navigationseigenschaften synchronisiert.After the graph is attached to the object context (for example, after you call the ApplyChanges method), the foreign key properties and navigation properties are synchronized.

    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.Not having a reference navigation property synchronized with the appropriate principal object could be an issue if you have specified cascade delete on the foreign key relationship. Wenn Sie das Prinzipalobjekt löschen, wird der Löschvorgang nicht an die abhängigen Objekte weitergegeben.If you delete the principal, the delete will not be propagated to the dependent objects. Wenn Sie Löschweitergaben festgelegt haben, verwenden Sie Navigationseigenschaften zum Ändern der Beziehungen, statt die Fremdschlüsseleigenschaft festzulegen.If you have cascade deletes specified, use navigation properties to change relationships instead of setting the foreign key property.

  • Mit Entitäten mit Selbstnachverfolgung kann kein Lazy Loading durchgeführt werden.Self-tracking entities are not enabled to perform lazy loading.

  • Eine binäre Serialisierung sowie die Serialisierung in ASP.NET-Zustandsverwaltungsobjekte werden nicht von Entitäten mit Selbstnachverfolgung unterstützt.Binary serialization and serialization to ASP.NET state management objects is not supported by self-tracking entities. Sie können jedoch die Vorlage anpassen, um die Unterstützung der binären Serialisierung hinzuzufügen.However, you can customize the template to add the binary serialization support. Weitere Informationen finden Sie unter Using Binary Serialization and ViewState with Self-Tracking Entities (Verwenden von binärer Serialisierung und ViewState mit Entitäten mit Selbstnachverfolgung).For more information, see Using Binary Serialization and ViewState with Self-Tracking Entities.

SicherheitsüberlegungenSecurity Considerations

Die folgenden Sicherheitsüberlegungen sollten Sie beim Arbeiten mit Entitäten mit Selbstnachverfolgung berücksichtigen:The following security considerations should be taken into account when working with self-tracking entities:

  • Ein Dienst sollte Anforderungen nicht vertrauen, Daten von einem nicht vertrauenswürdigen Client oder über einen nicht vertrauenswürdigen Kanal abzurufen oder zu aktualisieren.A service should not trust requests to retrieve or update data from a non-trusted client or through a non-trusted channel. Ein Client muss authentifiziert werden: Es sollte ein sicherer Kanal oder ein Nachrichtenumschlag verwendet werden.A client must be authenticated: a secure channel or message envelope should be used. 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.Clients' requests to update or retrieve data must be validated to ensure they conform to expected and legitimate changes for the given scenario.
  • Vertrauliche Informationen sollten nicht als Entitätsschlüssel verwendet werden (z. B. Sozialversicherungsnummern).Avoid using sensitive information as entity keys (for example, social security numbers). 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.This mitigates the possibility of inadvertently serializing sensitive information in the self-tracking entity graphs to a client that is not fully trusted. 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.With independent associations, the original key of an entity that is related to the one that is being serialized might be sent to the client as well.
  • Um die Weitergabe von Ausnahmemeldungen mit vertraulichen Daten an die Clientebene zu verhindern, sollten Aufrufe von ApplyChanges und SaveChanges auf Serverebene von Ausnahmebehandlungscode umschlossen sein.To avoid propagating exception messages that contain sensitive data to the client tier, calls to ApplyChanges and SaveChanges on the server tier should be wrapped in exception-handling code.