Arbeiten mit POCO-Entitäten (Entity Framework)

Entity Framework ermöglicht es Ihnen, benutzerdefinierte Datenklassen zusammen mit dem Datenmodell zu verwenden, ohne Änderungen an den Datenklassen selbst vornehmen zu müssen. Dies bedeutet, dass Sie POCO-Objekte (Plain-old CLR objects), z. B. vorhandene Domänenobjekte, mit dem Datenmodell verwenden können. Diese POCO-Datenklassen (auch Persistenz ignorierende Objekte genannt), die Entitäten zugeordnet werden, die in einem Datenmodell definiert werden, unterstützen einen Großteil des Abfrage-, Einfüge-, Aktualisierungs- und Löschverhaltens, das auch die Entitätstypen unterstützen, die von den Entity Data Model -Tools generiert werden.

Zuordnungsanforderungen

Um POCO-Entitäten mit einem Datenmodell verwenden zu können, muss der Name des Entitätstyps dem Namen der benutzerdefinierte Datenklasse entsprechen, und jede Eigenschaft des Entitätstyps muss einer öffentlichen Eigenschaft der benutzerdefinierten Datenklasse zugeordnet werden. Die Namen der Typen und der einzelnen zugeordneten Eigenschaften müssen äquivalent sein. Informationen zum Ändern von Entitäten in einem konzeptionellen Modell finden Sie unter How to: Create and Modify Entity Types.

Dd456853.note(de-de,VS.100).gifHinweis:
Das Zuordnen von POCO-Entitäten wird nicht unterstützt, wenn Zuordnungsattribute auf benutzerdefinierte Datenklassen angewendet werden, einschließlich EdmSchemaAttribute auf Assemblyebene.

Mit der POCO-Vorlage können Entitätstypen, die die Persistenz ignorieren aus einem konzeptionellen Modell generiert werden. Die Vorlage ist nicht in Visual Studio enthalten, kann jedoch aus der Visual Studio Gallery heruntergeladen werden.

Proxyobjekterstellung

Wenn Sie möchten, dass Entity Framework Änderungen in den POCO-Klassen verfolgt, während die Änderungen auftreten, und das Lazy Loading von verknüpften Objekten unterstützt, dann müssen die POCO-Klassen die im Thema Anforderungen für die Erstellung von POCO-Proxys (Entity Framework) beschriebenen Anforderungen erfüllen.

Wenn die Proxyobjekterstellung für POCO-Entitäten aktiviert wird, werden Änderungen, die am Diagramm und den Eigenschaftswerten von Objekten vorgenommen werden, sofort automatisch vom Entity Framework verfolgt. Weitere Informationen zu den Optionen zum Verfolgen von Änderungen mit und ohne Proxys finden Sie unter Verfolgen von Änderungen in POCO-Entitäten (Entity Framework).

Sie können eine Mischung von POCO-Entitäten und Proxyentitätsobjekten verwenden. Um die Erstellung von Proxyobjekten zu deaktivieren, legen Sie den Wert der ProxyCreationEnabled-Eigenschaft bei der Instanz von ObjectContextOptions, die von der ContextOptions-Eigenschaft für das ObjectContext-Objekt zurückgegeben wird, auf false fest:

' Disable proxy object creation. 
context.ContextOptions.ProxyCreationEnabled = False
// Disable proxy object creation.
context.ContextOptions.ProxyCreationEnabled = false;

Weitere Informationen hierzu finden Sie unter Gewusst wie: Erstellen einer POCO-Entität mit Proxys (Entity Framework).

Serialisieren von POCO-Proxys

Windows Communication Foundation (WCF) kann Proxys nicht direkt serialisieren oder deserialisieren, da der DataContractSerializer nur bekannte Typen serialisieren und deserialisieren kann, und Proxytypen sind keine bekannten Typen. Wenn POCO-Entitäten serialisiert werden müssen, deaktivieren Sie die Proxyerstellung oder verwenden Sie die ProxyDataContractResolver-Klasse, um Proxyobjekte als ursprüngliche POCO-Entitäten zu serialisieren. Um die Proxyerstellung zu deaktivieren, legen Sie die ProxyCreationEnabled-Eigenschaft auf false fest.

Die ProxyDataContractResolver-Klasse ordnet während der Serialisierung POCO-Typen Proxytypen zu. Um den DataContractSerializer anzuweisen, die ProxyDataContractResolver-Klasse in Dienstvorgängen zu verwenden, definieren Sie eine Attributklasse (die auf die Dienstvorgänge angewendet wird), die den ProxyDataContractResolver intern verwendet, um reinen POCO-Typen Proxytypen zuzuordnen. Verknüpfen Sie diese Attributklasse mit Methoden, die ein Teil eines Dienstvertrags in der WCF-Anwendung sind.

Der Client empfängt und deserialisiert die POCO-Entitäten. Diese Klassen verfügen nicht über die Lazy Loading- und Änderungsverfolgungsfunktionen von Proxyobjekten. Um über Ebenen hinweg Änderungen an diesen Entitäten nachzuverfolgen, verwenden Sie Entitäten mit Selbstnachverfolgung. Entitäten mit Selbstnachverfolgung sind POCO-Entitäten, die nicht vom Entity Framework abhängig sind und eine eigene Änderungsnachverfolgungslogik enthalten. Weitere Informationen hierzu finden Sie unter Exemplarische Vorgehensweise: Serialisieren von Entitäten mit Selbstnachverfolgung (Entity Framework).

Weitere Informationen hierzu finden Sie unter Exemplarische Vorgehensweise: Serialisieren von POCO-Proxys mit WCF (Entity Framework).

Proxyobjekte können mit binärer Serialisierung serialisiert werden und deserialisiert werden. Wenn Sie ein Objektdiagramm über AppDomain-Grenzen hinweg serialisieren, müssen Sie jedoch sicherstellen, dass die Proxytypdefinitionen in der Zielumgebung vorhanden sind. Wenn die Typen nicht vorhanden sind, schlägt die Deserialisierung fehl. Um sicherzustellen, dass der Typ vorhanden ist, verwenden Sie CreateProxyTypes.

Dd456853.note(de-de,VS.100).gifHinweis:
Obwohl ein Objekt eines Proxytyps erstellt wird, verfügt es nicht über die Lazy Loading- und Änderungsnachverfolgungsfunktionen eines Proxys.

Mit binärer Serialisierung und Datenvertragsserialisierung werden verbundene Objekte zusammen mit dem primären Objekt serialisiert. 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. Wenn Sie die Proxytypgenerierung nicht deaktivieren (womit Lazy Loading deaktiviert würde), deaktivieren Sie Lazy Loading explizit wie im folgende Beispiel.

' Disable lazy loading. 
context.ContextOptions.LazyLoadingEnabled = False
// Disable lazy loading.
context.ContextOptions.LazyLoadingEnabled = false;

Weitere Informationen finden Sie unter Serialisieren von Objekten (Entity Framework).

Zusammenfassung proxyspezifischer APIs

Die folgenden APIs sind für die Arbeit mit POCO-Proxys relevant:

Member Beschreibung

CreateObject

Erstellt ein neues POCO-Proxyobjekt, wenn die POCO-Klasse die im Thema Anforderungen für die Erstellung von POCO-Proxys (Entity Framework) beschriebenen Anforderungen erfüllt und ProxyCreationEnabled auf true festgelegt wurde, andernfalls wird ein Objekt mit einem generischen Argumenttyp erstellt. Das generische Argument dieser Methode kann jeder konkreter Verweistyp sein (abstrakte Klassen, Schnittstellen und Werttypen werden nicht unterstützt). Wenn der generische Typ ein CLR-Typ ist, der dem konzeptionellen Modell nicht zugeordnet wurde, oder ein Typ, der die Anforderungen für die Proxyerstellung nicht erfüllt, dann versucht die Methode, irgendeinen parameterlosen Konstruktor vom übergebenen Typ zu verwenden, um eine neue Instanz des Typs zu erstellen und zurückzugeben. Neben der CreateObject-Methode für ObjectContext können Sie die CreateObject-Methode und CreateObject-Methode für ObjectSet verwenden. Weitere Informationen hierzu finden Sie unter Gewusst wie: Erstellen einer POCO-Entität mit Proxys (Entity Framework).

Diese Methode fügt das erstellte Objekt nicht in den Objektkontext ein. Sie müssen das Objekt mithilfe der im Thema Erstellen, Hinzufügen, Ändern und Löschen von Objekten (Entity Framework) beschriebenen Methoden dem Kontext hinzufügen.

ProxyCreationEnabled

Wenn dieses Flag auf true festgelegt ist, versucht das Entity Framework, Proxys für die POCO-Entitäten zu erstellen. Standardmäßig ist das Flag ProxyCreationEnabled auf true festgelegt.

GetObjectType

Die System.Data.Objects.ObjectContext.GetObjectType(System.Type)-Methode ist eine statische Methode, die den POCO-Typ zurückgibt, von dem sich der angegebene Proxy ableitet, wenn ein Proxytyp als Argument übergeben wurde. Wenn ein Nicht-Proxy-Typ übergeben wurde, wird der gleiche Typ von dieser Methode zurückgegeben.

CreateProxyTypes

Erstellt einen Satz von Proxytypen für die angegebenen POCO-Typen entsprechend den Metadaten, die in den ObjectContext-Kontext geladen wurden. Diese Methode instanziiert keine Objekte erstellter Proxytypen. Im folgenden Codebeispiel werden Proxys für die POCO-Klassen Customer und Order erstellt: context.CreateProxyTypes(new Type[] { typeof(Customer), typeof(Order) });

Wenn Sie Objekte aus der Datenquelle laden oder neue Objekte mit CreateObject erstellen, erstellt das Entity Framework während der Laufzeit Proxytypen für die POCO-Klassen. Es kann jedoch Szenarien geben, in denen Sie die Proxytypen im Voraus erstellen sollten. Wenn Sie beispielsweise ein Objektdiagramm über AppDomain-Grenzen hinweg serialisieren, sollten Sie sicherstellen, dass die Proxytypen in der Zielumgebung tatsächlich vorhanden sind. Wenn die Typen nicht vorhanden sind, schlägt die Deserialisierung fehl.

GetKnownProxyTypes

GetKnownProxyTypes ist eine statische Methode, die eine Enumeration zurückgibt, die alle Proxytypen enthält, die bislang im AppDomain erstellt wurden. In Serialisierungsszenarien kann diese Methode verwendet werden, um alle Typen zu ermitteln, die die Zielumgebung bereits enthalten und das Serialisierungsprogramm erkennen sollte.

In diesem Abschnitt

Anforderungen für die Erstellung von POCO-Proxys (Entity Framework)

Laden von verknüpften POCO-Objekten (Entity Framework)

Verfolgen von Änderungen in POCO-Entitäten (Entity Framework)

Gewusst wie: Definieren von POCO-Entitäten (Entity Framework)

Gewusst wie: Definieren eines benutzerdefinierten Objektkontexts (Entity Framework)

Gewusst wie: Anpassen von Modellierungs- und Zuordnungsdateien zur Verwendung mit benutzerdefinierten Objekten (Entity Framework)

Gewusst wie: Definieren eines benutzerdefinierten Objektkontexts (Entity Framework)

Gewusst wie: Erstellen einer POCO-Entität mit Proxys (Entity Framework)

Gewusst wie: Explizites Laden von POCO-Entitäten (Entity Framework)

Gewusst wie: Erkennen von Änderungen in POCO-Entitäten

Gewusst wie: Ändern von Beziehungen zwischen POCO-Entitäten (Entity Framework)

Im Folgenden finden Sie eine Reihe von Blogbeiträgen über POCO von ADO.NET.

POCO

POCO im Entity Framework 4 - Teil 2

POCO im Entity Framework 4 - Teil 3

Siehe auch

Konzepte

Anpassen von Objekten (Entity Framework)
Definieren und Verwalten von Beziehungen (Entity Framework)