Erstellen von N-Tier-Anwendungen (Entity Framework)

Entity Framework unterstützt die Serialisierung von Entitätsobjekten in Formate, die Remoteaustausch und nachrichtenbasierten Austausch von Entitätsobjekten ermöglichen, und die von Webdiensten und Windows Communication Foundation (WCF) verwendet werden. Objekte können mittels binärer Serialisierung, XML-Serialisierung und WCF-Vertragsserialisierung für den Transport über einen binären Stream oder nachrichtenbasierte Protokolle serialisiert werden. Weitere Informationen finden Sie unter Serialisieren von Objekten (Entity Framework). Objekte können auch über eine Nachricht oder einen Stream empfangen, deserialisiert und einem Objektkontext angefügt werden. Weitere Informationen finden Sie unter Anfügen und Trennen von Objekten (Entity Framework).

ADO.NET Data Services ermöglicht weiterhin die Bereitstellung dynamischen Zugriffs auf Entitätsdaten im XML-Format, das von Anwendungen verwendet werden kann. Auf diese Entitätsdaten wird mithilfe von standardmäßigen Representational State Transfer (REST) HTTP-Aktionen wie GET, PUT und POST zugegriffen. Weitere Informationen finden Sie unter ADO.NET Data Services.

Die folgenden Überlegungen gelten für Webdienste oder WCF-Dienste, die Entity Framework verwenden:

  • Mit binärer Serialisierung und Datenvertragsserialisierung werden verbundene Objekte zusammen mit dem primären Objekt serialisiert. Die XML-Serialisierung serialisiert keine verbundenen Objekte. Deaktivieren Sie beim Serialisieren von Entitäten Lazy Loading. Lazy Loading führt eine Abfrage für jede Beziehungsnavigationseigenschaft aus, auf die zugegriffen wird, und sowohl binäre als auch WCF-Datenvertragsserialisierungsprogramme greifen auf alle Beziehungsnavigationseigenschaften zu. Dadurch werden möglicherweise während der Serialisierung viele unerwartete Abfragen ausgeführt. Weitere Informationen finden Sie unter Serialisieren von Objekten (Entity Framework).

  • Es wird die Verwendung zustandsloser Dienste empfohlen. Die Dienste sollten so entworfen werden, dass ein Objektkontext nur für die Dauer einer Anforderung oder Antwort erhalten wird. Das Nachrichtenaustauschmuster sollte genügend Informationen für Änderungen enthalten, ohne dass Objekte dauerhaft gespeichert werden müssen oder die Datenquelle zum Abrufen des ursprünglichen Objekts erneut abgefragt werden muss. Beispielsweise sollte ein Dienst, der einem Client die Aktualisierung von Objekten ermöglicht, erfordern, dass das aktualisierte Objekt gemeinsam mit dem ursprünglichen Objekt zurückgegeben wird. Damit können Änderungen durch den Webdienst am ursprünglichen Objekt vorgenommen werden, ohne dass das ursprüngliche Objekt von der Datenbank abgerufen oder dauerhaft gespeichert werden muss. Weitere Informationen finden Sie unter Gewusst wie: Übernehmen von an einem getrennten Objekt vorgenommenen Änderungen (Entity Framework).

  • Objekte werden stets im Detached-Status deserialisiert. Das Objekt kann einem ObjectContext angefügt oder hinzugefügt werden, oder es können Eigenschaftsänderungen am ursprünglichen Objekt vorgenommen werden. Weitere Informationen finden Sie unter Anfügen und Trennen von Objekten (Entity Framework).

  • Sobald dem Kontext die Objekte und die Beziehungen hinzugefügt wurden, können Sie den neuen Zustand mit ChangeObjectState (z. B. Added oder Modified) festlegen.

  • Sie müssen Parallelität und Validierung manuell verwalten.

Weitere Informationen finden Sie in den folgenden Artikeln zur N-Tier-Entwicklung:

Anti-Patterns

N-Tier Application Patterns

Entitäten mit Selbstnachverfolgung

In einer Entity Framework -Anwendung ist ein Objektkontext für das Verfolgen von Änderungen in den Objekten zuständig. Ist es jedoch notwendig, Objekte in einer anderen Ebene zu bearbeiten, in der der Objektkontext nicht verfügbar ist, dann müssen Sie entscheiden, wie Änderungen nachzuverfolgen und diese Änderungen an den Objektkontext zurück zu melden sind. Ab Version 4 von .NET Framework können Entitäten mit Selbstnachverfolgung Ihnen helfen, Änderungen in jeder Ebene nachzuverfolgen. Eine Entität mit Selbstnachverfolgung ist eine Entität, die anhand einer Vorlage des Text Template Transformation Toolkit (Textvorlagentransformations-Toolkit, T4) erstellt wurde. Diese Vorlagen erstellen Entitätstypen, die über die Fähigkeit verfügen, Änderungen an skalaren, komplexen und Navigationseigenschaften aufzuzeichnen. Weitere Informationen finden Sie unter Arbeiten mit Entitäten mit Selbstnachverfolgung.

Um Änderungen in einer Ebene nachzuverfolgen, in der Objekte ohne Verwendung von Entitäten mit Selbstnachverfolgung nicht an einen Objektkontext angefügt sind, können Sie die im folgenden Abschnitt genannten Methoden verwenden, die Ihnen helfen, den Kontext zu aktualisieren, damit die relevanten Änderungen an der Datenbank beizubehalten werden.

Arbeiten mit für die N-Tier-Anwendungsentwicklung relevanten APIs

Die folgenden Methoden ermöglichen Ihnen, ein ganzes Diagramm von Objekten hinzuzufügen und dann dieses Diagramm zu durchlaufen, den Eigenschaften des Objekts die entsprechenden Werte zuzuweisen und den korrekten Zustand für Entitätsobjekte und Beziehungen festzulegen.

Verwenden Sie die folgenden Methoden, um Entitäten hinzuzufügen und 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, um diese Ausnahme zu vermeiden, die AddObject-Methode, um die getrennten Objekte anzufügen und dann deren Zustand angemessen zu ändern.

Verwenden Sie die folgenden Methoden, um skalare Werte zu ändern:

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.

Verwenden Sie die folgenden Methoden, um den Zustand der Entität und der Beziehung zu ändern:

Member 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 ChangeState-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.

Verwenden Sie die folgenden Methoden, um Änderungen in der Datenquelle zu speichern:

Member Beschreibung

SaveChanges

Speichert alle Änderungen der Datenquelle permanent.

Verwenden Sie das ObjectMaterialized-Ereignis, wenn Sie Informationen abrufen oder festlegen möchten, oder abonnieren Sie während der Materialisierung des Objekts einige Ereignisse.

Member Beschreibung

ObjectMaterialized

Tritt auf, wenn im Rahmen einer Abfrage oder eines Ladevorgangs ein neues Entitätsobjekt aus Daten in der Datenquelle erstellt wird. Das Ereignis wird ausgelöst, nachdem Verweisobjekte geladen wurden, aber bevor Auflistungen geladen werden. Wenn ein Objekt mit dem gleichen Schlüsselwert schon im Objektkontext vorhanden ist, erstellt Entity Framework das Objekt nicht neu, und dieses Ereignis wird nicht ausgelöst.

Siehe auch

Konzepte

Arbeiten mit Objekten (Entity Framework)