Komplexe Typen

Die Unterstützung von komplexen Typen in WCF RIA Services bietet eine Möglichkeit, eine Reihe von Entitätseigenschaften in einer einzelnen (komplexen) Eigenschaft zu kapseln. Mit diesen Typen kann eine Entität vereinfacht werden, die eine bestimmte Teilmenge verwandter Eigenschaften enthält. Komplexe Typen können auch von einer anderen (verschiedenen) Entität wiederverwendet werden, die die gleiche Teilmenge von Eigenschaften verwendet. Ein häufig verwendetes Beispiel eines komplexen Typs ist eine Address, in der die erforderlichen Entitätseigenschaften zum Angeben einer Adresse gesammelt werden. Die Gruppe von Eigenschaften in einem Address-Typ kann beispielsweise die Entitätseigenschaften StreetAddress, City, StateProvince, PostalCode und Country umfassen. Dieser komplexe Typ kann sowohl von der Entität Customer als auch von der Entität Contact verwendet werden, wenn diese ebenfalls den entsprechenden Eigenschaftensatz verwenden. Der benutzerdefinierte Address-Typ kann daher nach dem Definieren selbst als Entitätseigenschaft in anderen Entitäten verwendet werden.

Ein komplexer Typ ist eine Vorlage zum Definieren von umfangreichen, strukturierten Eigenschaften in Entitätstypen oder anderen komplexen Entitäten, da der komplexe Typ Eigenschaften enthalten kann, die selbst komplexe Typen darstellen. Komplexe Typen müssen einen eindeutigen Namen in ihrem Namespace angeben und (optional) Daten in Form einer oder mehrerer Eigenschaften enthalten. Komplexe Typen können nur Eigenschaften von Entitätstypen oder anderen komplexen Typen sein, da sie keine Identitäten aufweisen und somit nicht unabhängig sein können. Komplexe Typen sind echte Typen und können daher instanziiert und in Code verwendet werden. Sie können jedoch nicht wie Entitätstypen unmittelbar abgefragt oder in einer Datenbank beibehalten werden. Komplexe Typen können im Gegensatz zu Entitäten auch nicht Teil einer Zuordnung sein. Navigationseigenschaften können daher in komplexen Typen nicht wie in Entitätstypen definiert werden.

Unterstützung für komplexe Nichtentitätstypen wurde in WCF RIA Services V1.0 SP1 hinzugefügt. Insbesondere wird CODEGEN für komplexe Typen unterstützt, die von der Basisklasse ComplexObject abgeleitet werden. Die Unterstützung für das Generieren von Clientproxys ist ähnlich umfassend wie für Entitäten in RIA Services . Darüber hinaus wird die Metadatenunterstützung entsprechend den Entitäten ebenso bereitgestellt wie eine umfassende Validierung, Änderungsnachverfolgung, Bearbeitungssitzungen und die Unterstützung für komplexe Typparameter. Dies bedeutet, dass benutzerdefinierte Typen wie Address jetzt nicht nur als Entitätseigenschaften, sondern auch als Parameter oder Rückgabewerte für Domänendienstmethoden verwendet werden können.

Definieren und Darstellen eines komplexen Typs

In diesem Abschnitt wird beschrieben, wie der EDM (Entity Data Model Designer) verwendet wird, um eine Reihe von Entitätseigenschaften von einem Entitätstyp in einem komplexen Typ zu kapseln. Der EDM verwendet eine domänenspezifische Sprache (DSL) mit der Bezeichnung konzeptionelle Schemadefinitionssprache (CSDL), um konzeptionelle Modelle zu definieren. Die XML-Darstellung des komplexen Typs in CSDL hinter dem Designer wird untersucht.

In diesem Thema wird davon ausgegangen, dass Sie sich bereits mit Exemplarische Vorgehensweise: Erstellen einer RIA Services-Projektmappe beschäftigt haben bzw. über entsprechende Kenntnisse verfügen und eine RIA Services -Projektmappe besitzen.

Erstellen eines komplexen Typs mit dem Designer

  1. Öffnen Sie die Projektmappe RIAServicesExample aus Exemplarische Vorgehensweise: Erstellen einer RIA Services-Projektmappe, und öffnen Sie die Datei AdventureWorksModel.edmx (standardmäßig) im Entity Framework Designer.

  2. Wählen Sie folgende Eigenschaften von der Address-Entität aus: AddressLine1, AddressLine2, City, StateProvince, CountryRegion und PostalCode.

  3. Klicken Sie mit der rechten Maustaste auf eine der Eigenschaften, und wählen Sie In neuen komplexen Typ umgestalten aus. Der Modellbrowser wird geöffnet, und der gerade erstellte komplexe Typ (standardmäßig: ComplexType1) wird im Ordner ComplexTypes von AdventureWorksModel.edmx angezeigt. Der im Modellbrowser angegebene Name ist eigentlich der Typ der neuen ComplexProperty. Die untergeordneten Eigenschaften, die in dieser neuen komplexen Eigenschaft gekapselt sind, werden jetzt im Modellbrowser angezeigt.

  4. Wählen Sie den ComplexType1 im Modellbrowser aus und ändern Sie diesen in MailAddress. Dies ist jetzt der Typ der neuen ComplexProperty. Sie können dies überprüfen, indem Sie die ComplexProperty in der Entität Address auswählen und den Typ im Fenster Eigenschaften beachten.

  5. Ändern Sie den Namen des neuen MailAddress-Typs im Fenster Eigenschaften in MailAddress. Der neue Name wird jetzt auch im Designer angezeigt.

  6. Wählen Sie im Designer die MailAddress aus, klicken Sie mit der rechten Maustaste darauf, und wählen Sie Tabellenzuordnung aus, um auf die Tabelle Mappingdetails zuzugreifen. In dieser Tabelle wird die Zuordnung der Eigenschaften für die Tabellenspalten in der Datenbank veranschaulicht.

XML-Darstellung des komplexen Typs

RIA Services verwendet die konzeptionelle Schemadefinitionssprache (CSDL), um Datenmodelle anzugeben. Die konzeptionelle Schemadefinitionssprache ist eine XML-basierte Sprache, die die Entitäten, Beziehungen und Funktionen beschreibt, die ein konzeptionelles Modell einer datengesteuerten Anwendung bilden. Der neue MailAddress-Typ wird im CSDL-Abschnitt des XML-Codes angegeben.

Um auf die ausgewählte EDMX-Datei AdventureWorksModel im Projektmappen-Explorer zuzugreifen, klicken Sie mit der rechten Maustaste darauf, und wählen Sie Öffnen mit und dann XML (Text) Editor aus. Die Entwurfsansicht des Datenmodells muss von Visual Studio 2010 geschlossen werden, damit die XML-Darstellung geöffnet werden kann. Wählen Sie daher Ja aus, um diesen Vorgang zu bestätigen. Die neue MailAddress-Eigenschaft ist im Element <EntityType Name=”Address”> angegeben:

<Property Name="MailAddress" Type="AdventureWorksLTModel.MailAddress" Nullable="false" />

Die MailAddress-Eigenschaft wird in einem eigenen Element unterhalb der Abschnitte definiert, in denen die Zuordnungen definiert werden.

        <ComplexType Name="MailAddress">
          <Property Type="String" Name="AddressLine1" Nullable="false" MaxLength="60" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="AddressLine2" MaxLength="60" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="City" Nullable="false" MaxLength="30" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="StateProvince" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="CountryRegion" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" />
          <Property Type="String" Name="PostalCode" Nullable="false" MaxLength="15" FixedLength="false" Unicode="true" />
        </ComplexType>

Beachten Sie, dass das <ComplexType>-Element im Gegensatz zum <EntityType>-Element kein <Key>-Element enthält.

Wiederverwenden eines komplexen Typs in einer anderen Entität

Bei einem Manufacturer-Entitätstyp mit identischen Adresseigenschaften könnten diese im komplexen MailAddress-Typ gekapselt werden. Verwenden Sie analog zur Erstellung des komplexen Typs die Option In neuen komplexen Typ umgestalten und ändern Sie den Typ und den Namen im Eigenschaftenfenster. Diese Felder verweisen wieder auf die entsprechenden Entitäten. Das Feld City für die MailAddress der Address-Entität wird beispielsweise der Address.City zugeordnet, während dieses Feld beim Manufacturer-Entitätstyp der Manufacturer.City zugeordnet wird. In der Tabelle Mappingdetails können Sie überprüfen, dass die Eigenschaften wieder den richtigen Spalten in der Datenbank zugeordnet werden.