Condividi tramite


Tipi complessi

Il supporto di tipi complessi in WCF RIA Services fornisce una modalità per incapsulare un set di proprietà di entità in una sola proprietà complessa. Questi tipi possono essere utilizzati per semplificare un'entità quando contiene un particolare sottoinsieme di proprietà correlate. I tipi complessi possono essere riutilizzati anche da un'altra entità differente che condivide lo stesso sottoinsieme di proprietà. Un esempio comune di tipo complesso è un elemento Addressche raggruppa insieme le proprietà di entità richieste per specificare un indirizzo. Il set di proprietà in un tipo Address potrebbe includere, ad esempio, le proprietà di entità StreetAddress, City, StateProvince, PostalCode e Country. Questo tipo complesso può essere utilizzato da entità Customer e Contact purché ciascuna condivida questo set di proprietà. Quindi una volta definito, il tipo Address personalizzato può essere utilizzato come proprietà di entità in altre entità.

Un tipo complesso è un modello per la definizione di proprietà dettagliate e strutturate per tipi di entità o altre entità complesse, dal momento che un tipo complesso può contenere proprietà che sono anche di un tipo complesso. Il nome del tipo complesso deve essere univoco all'interno dello spazio dei nomi e può facoltativamente contenere dati nel formato di una o più proprietà. I tipi complessi possono esistere solo come proprietà in tipi di entità o altri tipi complessi dal momento che non dispongono delle identità e quindi non possono esistere indipendentemente. I tipi complessi sono tipi genuini e quindi è possibile crearne istanze e utilizzarle nel codice, ma non è possibile eseguirvi le query direttamente o salvarle in un database, come può un tipo di entità. I tipi complessi differiscono dalle entità anche perché non possono partecipare a un'associazione. Quindi le proprietà di navigazione non possono essere definite sui tipi complessi come sui tipi di entità.

In WCF RIA Services V1.0 SP1 è stato aggiunto il supporto dei tipi complessi non di entità. In particolare, il supporto è fornito per la generazione del codice dei tipi complessi che derivano dalla classe di base ComplexObject. Il supporto per la generazione di proxy client è completo al pari di quello per le entità in RIA Services . È fornito anche il supporto per i metadati come per le entità, come anche la convalida completa, il rilevamento delle modifiche, le sessioni di modifica e il supporto per parametri di tipo complesso. Ciò significa che è possibile utilizzare i tipi personalizzati, ad esempio Address, non solo come proprietà di entità, ma che come parametri o come valori restituiti per i metodi del servizio del dominio.

Definizione e rappresentazione di un tipo complesso

In questa sezione viene descritto come utilizzare Entity Data Model (EDM) Designer per incapsulare un set di proprietà di entità esistenti da un tipo di entità in un tipo complesso. Entity Data Model (EDM) utilizza un linguaggio specifico di dominio detto CSDL (Conceptual Schema Definition Language) per definire i modelli concettuali. Viene esaminata la rappresentazione XML del tipo complesso in CSDL, dietro la finestra di progettazione.

In questo argomento si presuppone che sia stata completata la Procedura dettagliata: creazione di una soluzione Servizi RIA o che si disponga di conoscenze equivalenti e di una soluzione RIA Services esistente.

Creazione di un tipo complesso con la finestra di progettazione

  1. Aprire la soluzione RIAServicesExample ottenuta dall'esecuzione della Procedura dettagliata: creazione di una soluzione Servizi RIA e aprire il file AdventureWorksModel.edmx (come per impostazione predefinita) nella finestra di progettazione di Entity Framework.

  2. Selezionare le proprietà seguenti dall'entità Address: AddressLine1, AddressLine2, City, StateProvince, CountryRegion e PostalCode.

  3. Fare clic con il pulsante destro del mouse su una proprietà e selezionare Effettua refactoring nel nuovo tipo complesso. Viene quindi aperto il Browser modello dove il tipo complesso appena creato, denominato ComplexType1 per impostazione predefinita, viene visualizzato nella cartella ComplexTypes di AdventureWorksModel.edmx. Il nome specificato nel Browser modello è effettivamente il tipo del nuovo elemento ComplexProperty. Le sottoproprietà incapsulate da questa nuova proprietà complessa sono ora visibili nel Browser modello.

  4. Selezionare ComplexType1 nel Browser modello e impostarlo su MailAddress. A questo punto è il tipo del nuovo elemento ComplexProperty come è possibile verificare selezionando ComplexProperty nell'entità Address e notando il tipo nel finestra Proprietà.

  5. Impostare il nome del nuovo tipo MailAddress su MailAddress nella finestra Proprietà. Notare che questo nuovo nome viene visualizzato anche nella finestra di progettazione.

  6. Selezionare MailAddress nella finestra di progettazione, fare clic con il pulsante destro del mouse e selezionare Mapping tabelle per accedere alla tabella Dettagli Mapping. Questa tabella indica come le proprietà vengono mappate nelle colonne della tabella del database.

Rappresentazione XML del tipo complesso

RIA Services utilizza il linguaggio CSDL (Conceptual Schema Definition Language) per specificare i modelli di dati. È un linguaggio basato su XML che descrive le entità, le relazioni e le funzioni che costituiscono un modello concettuale di un'applicazione basata sui dati. La specifica del nuovo tipo MailAddress è nella sezione CSDL dell'XML.

Per accedere, selezionare AdventureWorksModel.edmx in Esplora soluzioni, fare clic con il pulsante destro del mouse su Apri con e scegliere Editor XML (Testo). In Visual Studio 2010 verrà chiusa la visualizzazione Struttura del modello di dati per aprire la rappresentazione XML, quindi selezionare per confermare l'operazione. Notare che la nuova proprietà MailAddress viene specificata all'interno dell'elemento <EntityType Name=”Address”>:

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

La proprietà MailAddress è definita nel relativo elemento sotto le sezioni in cui sono definite le associazioni.

        <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>

Notare che non è disponibile alcun elemento <Key> all'interno dell'elemento <ComplexType> dal momento che esiste un elemento <EntityType>.

Riutilizzo di un tipo complesso in un'altra entità

Se era disponibile un tipo di entità Manufacturer contenente lo stesso set di proprietà di indirizzo, è stato possibile incapsularlo nel tipo MailAddress complesso. Utilizzare Effettua refactoring nel nuovo tipo complesso come per creare il tipo complesso e modificare quindi il tipo e il nome nella finestra Proprietà. I campi punteranno di nuovo alle rispettive entità. Ad esempio, il campo City per MailAddress dell'entità Address eseguirà il mapping a Address.City, mentre il campo eseguirà il mapping a Manufacturer.City per il tipo di entità Manufacturer. Utilizzare la tabella Dettagli Mapping per assicurarsi che le proprietà eseguano nuovamente il mapping alle colonne corrette nel database.