Reflektionsanbieter (WCF Data Services)
Zusätzlich zu Daten aus einem Datenmodell über das Entity Framework kann WCF Data Services Daten verfügbar machen, die in einem entitätsbasierten Modell nicht streng definiert sind. Der Reflexionsanbieter macht Daten in Klassen verfügbar, die Typen zurückgeben, die die IQueryable<T>-Schnittstelle implementieren. WCF Data Services verwendet Reflexion, um ein Datenmodell für diese Klassen abzuleiten, und kann adressenbasierte Abfragen nach Ressourcen in LINQ (Language Integrated Query)-basierte Abfragen nach den verfügbar gemachten IQueryable<T>-Typen übersetzen.
Hinweis
Sie können eine IQueryable<T>-Schnittstelle mithilfe der AsQueryable-Methode aus einer Klasse zurückgeben, die die IEnumerable<T>-Schnittstelle implementiert.Dies ermöglicht die Verwendung der meisten generischen Auflistungstypen als Datenquelle für den Datendienst.
Der Reflektionsanbieter unterstützt Typhierarchien. Weitere Informationen finden Sie unter Gewusst wie: Erstellen eines Datendiensts mithilfe des Reflektionsanbieters (WCF Data Services).
Herleiten des Datenmodells
Wenn Sie den Datendienst erstellen, leitet der Anbieter das Datenmodell mithilfe der Reflektion her. In der folgenden Liste wird gezeigt, wie der Reflektionsanbieter das Datenmodell herleitet:
Entitätscontainer - die Klasse, die die Daten als Eigenschaften verfügbar macht, die eine IQueryable<T>-Instanz zurückgeben. Wenn Sie ein reflektionsbasiertes Datenmodell adressieren, stellt der Entitätscontainer den Stamm des Diensts dar. Es wird nur eine Entitätscontainerklasse für einen angegebenen Namespace unterstützt.
Entitätenmengen - Eigenschaften, die IQueryable<T>-Instanzen zurückgeben, werden als Entitätenmengen behandelt. Entitätenmengen werden in der Abfrage direkt als Ressourcen adressiert. Nur eine Eigenschaft im Entitätscontainer kann eine IQueryable<T>-Instanz eines angegebenen Typs zurückgeben.
Entitätstypen - der Typ T der IQueryable<T>, den die Entitätenmenge zurückgibt. Klassen, die Teil einer Vererbungshierarchie sind, werden vom Reflektionsanbieter in eine entsprechende Entitätstyphierarchie übersetzt.
Entitätsschlüssel - jede Datenklasse, die ein Entitätstyp ist, muss über eine Schlüsseleigenschaft verfügen. Dieser Eigenschaft wird das DataServiceKeyAttribute-Attribut ([DataServiceKeyAttribute]) zugewiesen.
Hinweis
Sie sollten das DataServiceKeyAttribute-Attribut nur auf eine Eigenschaft anwenden, mit der eine Instanz des Entitätstyps eindeutig identifiziert werden kann.Dieses Attribut wird ignoriert, wenn es auf eine Navigationseigenschaft angewendet wird.
Entitätstypeigenschaften - im Gegensatz zum Entitätsschlüssel behandelt der Reflektionsanbieter die zugänglichen, nicht indizierten Eigenschaften einer Klasse, die ein Entitätstyp ist, wie folgt:
Wenn die Eigenschaft einen primitiven Typ zurückgibt, dann wird davon ausgegangen, dass die Eigenschaft eine Eigenschaft eines Entitätstyps ist.
Wenn die Eigenschaft einen Typ zurückgibt, der auch ein Entitätstyp ist, dann wird davon ausgegangen, dass die Eigenschaft eine Navigationseigenschaft ist, die das "1"-Ende einer n:1- oder 1:1-Beziehung darstellt.
Wenn die Eigenschaft einen IEnumerable<T> eines Entitätstyps zurückgibt, dann wird davon ausgegangen, dass die Eigenschaft eine Navigationseigenschaft ist, die das "n"-Ende einer 1:n- oder m:n-Beziehung darstellt.
Wenn es sich beim Rückgabetyp der Eigenschaft um einen Werttyp handelt, stellt die Eigenschaft einen komplexen Typ dar.
Hinweis
Im Gegensatz zu einem Datenmodell, das auf dem Entitätsbeziehungsmodell basiert, verstehen auf dem Reflektionsanbieter basierende Modelle keine relationalen Daten.Verwenden Sie das Entity Framework, um relationale Daten über WCF Data Services verfügbar zu machen.
Datentypzuordnung
Wenn ein Datenmodell aus .NET Framework-Klassen abgeleitet wird, werden die primitiven Typen im Datenmodell .NET Framework-Datentypen wie folgt zugeordnet:
.NET Framework-Datentyp |
Datenmodelltyp |
---|---|
Byte[] |
Edm.Binary |
Edm.Boolean |
|
Edm.Byte |
|
Edm.DateTime |
|
Edm.Decimal |
|
Edm.Double |
|
Edm.Guid |
|
Edm.Int16 |
|
Edm.Int32 |
|
Edm.Int64 |
|
Edm.SByte |
|
Edm.Single |
|
Edm.String |
Hinweis
.NET Framework-Werttypen, denen ein NULL-Wert zugewiesen werden kann, werden den gleichen Datenmodelltypen zugeordnet wie den entsprechenden Werttypen, denen kein NULL-Wert zugewiesen werden kann.
Aktivieren von Updates im Datenmodell
Der Reflektionsanbieter definiert eine IUpdatable-Schnittstelle, um Updates für Daten zu ermöglichen, die durch diese Art von Datenmodell verfügbar gemacht werden. Diese Schnittstelle weist den Datendienst an, wie Updates für die verfügbar gemachten Typen beibehalten werden. Die Entitätscontainerklasse muss die IUpdatable-Schnittstelle implementieren, um Updates für vom Datenmodell definierte Ressourcen zu aktivieren. Ein Beispiel für eine Implementierung der IUpdatable-Schnittstelle finden Sie unter Gewusst wie: Erstellen eines Datendiensts mit einer LINQ to SQL-Datenquelle (WCF Data Services).
Die IUpdatable-Schnittstelle erfordert, dass die folgenden Member implementiert werden, damit Updates mit dem Reflektionsanbieter zur Datenquelle weitergegeben werden können:
Member |
Beschreibung |
---|---|
Stellt die Funktionen bereit, um ein Objekt einer Auflistung von verknüpften Objekten hinzuzufügen, auf die von einer Navigationseigenschaft aus zugegriffen wird. |
|
Stellt die Funktionen bereit, die ausstehende Änderungen der Daten abbrechen. |
|
Stellt die Funktionen bereit, um im angegebenen Container eine neue Ressource zu erstellen. |
|
Stellt die Funktionen zum Löschen einer Ressource bereit. |
|
Stellt die Funktionen zum Abrufen einer Ressource bereit, die durch eine bestimmte Abfrage und einen Typnamen identifiziert wird. |
|
Stellt die Funktionen bereit, um den Wert einer Eigenschaft einer Ressource zurückzugeben. |
|
Stellt die Funktionen bereit, um ein Objekt aus einer Auflistung von verknüpften Objekten zu entfernen, auf die von einer Navigationseigenschaft aus zugegriffen wird. |
|
Stellt die Funktionen bereit, um eine angegebene Ressource zu aktualisieren. |
|
Stellt die Funktionen bereit, um die Ressource zurückzugeben, die durch eine bestimmte Objektinstanz dargestellt wird. |
|
Stellt die Funktionen bereit, um alle ausstehenden Änderungen zu speichern. |
|
Stellt die Funktionen bereit, um mit einer Navigationseigenschaft einen verknüpften Objektverweis festzulegen. |
|
Stellt die Funktionen bereit, um den Wert der Eigenschaft einer Ressource festzulegen. |
Behandeln von Parallelität
WCF Data Services unterstützt ein Modell vollständiger Parallelität, indem es Ihnen das Definieren eines Parallelitätstokens für eine Entität ermöglicht. Dieses Parallelitätstoken, das eine oder mehrere Eigenschaften der Entität beinhaltet, wird vom Datendienst verwendet, um zu bestimmen, ob eine Änderung in den angeforderten, aktualisierten oder gelöschten Daten aufgetreten ist. Wenn Tokenwerte die vom eTag in der Anforderung abgerufen wurden, sich von den aktuellen Werten der Entität unterscheiden, löst der Datendienst eine Ausnahme aus. Das ETagAttribute wird auf einen Entitätstyp angewendet, um im Reflektionsanbieter ein Parallelitätstoken zu definieren. Im Parallelitätstoken darf keine Schlüsseleigenschaft oder Navigationseigenschaft enthalten sein. Weitere Informationen finden Sie unter Aktualisieren des Datendiensts WCF Data Services.
Verwenden von LINQ to SQL mit dem Reflektionsanbieter
Da das Entity Framework standardmäßig systemintern unterstützt wird, ist es der empfohlene Datenanbieter zum Verwenden von relationalen Daten mit WCF Data Services. Sie können allerdings LINQ to SQL-Klassen mithilfe des Reflektionsanbieters mit einem Datendienst verwenden. Die Table<TEntity>-Resultsets, die von Methoden für den DataContext zurückgegeben werden, der vom LINQ to SQL-O/R-Designer (Object Relational Designer) generiert wurde, implementieren die IQueryable<T>-Schnittstelle. Dies ermöglicht dem Reflektionsanbieter, auf diese Methoden zuzugreifen und mit den generierten LINQ to SQL-Klassen Entitätsdaten aus SQL Server zurückzugeben. Da LINQ to SQL die IUpdatable-Schnittstelle nicht implementiert, müssen Sie jedoch eine partielle Klasse hinzufügen, die die vorhandene partielle DataContext-Klasse erweitert, um die IUpdatable-Implementierung hinzuzufügen. Weitere Informationen finden Sie unter Gewusst wie: Erstellen eines Datendiensts mit einer LINQ to SQL-Datenquelle (WCF Data Services).