Condividi tramite


Procedura: definire un modello con un tipo complesso (Entity Framework)

Il tipo complesso in Entity Data Model (EDM) è un tipo di dati con una struttura interna ma senza una proprietà key. Il tipo complesso è utilizzato per implementare una proprietà che dispone di proprietà interne. Sia un'entità che un tipo complesso possono disporre di una proprietà dichiarata come tipo complesso.

Un tipo complesso è dichiarato nella sintassi analogamente a un tipo di entità. La differenza principale consiste nel fatto che un tipo complesso non include la dichiarazione di una proprietà key, come un'entità. Nella specifica di mapping un tipo complesso è mappato come proprietà complessa.

Per implementare una proprietà complessa

  1. Creare un progetto in Visual Studio del tipo della libreria di classi e aggiungere riferimenti a System.Data.Entity e System.Runtime.Serialization.

  2. Aggiungere un nuovo modello EDM (Entity Data Model) al progetto.

  3. Implementare lo schema CSDL (Conceptual Schema Design Language) e aggiungerlo al file CSDL fornito dal modello EDM. Lo schema include le dichiarazioni dell'entità CCustomer e la relativa proprietà Address che utilizza il tipo complesso CAddress. Lo schema completo è illustrato nel codice di esempio seguente.

  4. Eseguire edmgen.exe nello schema concettuale creato nel passaggio 2 per creare il codice oggetto.

  5. Implementare lo schema SSDL (Storage Schema Definition Language) e aggiungerlo al file SSDL fornito dal modello EDM. In questo schema i dati del tipo complesso sono archiviati nella stessa tabella dell'entità contenitore come illustrato dai metadati SSDL (Store Schema Design Language) seguenti. Lo schema completo è illustrato nel codice di esempio seguente.

  6. Implementare lo schema MSL (Mapping Specification Language) e aggiungerlo al file MSL fornito dal modello EDM. Nello schema di mapping seguente viene illustrato il mapping di Address sotto forma di proprietà complessa. La specifica di mapping completa è illustrata nel codice di esempio seguente.

Esempio

I tre schemi necessari sono illustrati consecutivamente nel codice XML seguente. Seguendo il codice, viene fornito uno script che può essere utilizzato per creare il database utilizzato per l'archiviazione in questo esempio.

    <Schema Namespace="CustomerComplexAddress"
        Alias="Self"
        xmlns="https://schemas.microsoft.com/ado/2006/04/edm">

        <EntityContainer Name="CustomerComplexAddressContext">
          <EntitySet Name="CCustomers" EntityType="CustomerComplexAddress.CCustomer" />
        </EntityContainer>

        <EntityType Name="CCustomer">
          <Key>
            <PropertyRef Name="CustomerId" />
          </Key>
          <Property Name="CustomerId" Type="Int32" Nullable="false" />
          <Property Name="CompanyName" Type="String" />
          <Property Name="ContactName" Type="String" />
          <Property Name="ContactTitle" Type="String" />
          <Property Name="Address" Type="Self.CAddress" Nullable="false" />
        </EntityType>

        <ComplexType Name="CAddress">
          <Property Name="StreetAddress" Type="String" />
          <Property Name="City" Type="String" />
          <Property Name="Region" Type="String" />
          <Property Name="PostalCode" Type="String" />
          <Property Name="Country" Type="String" />
          <Property Name="Phone" Type="String" />
          <Property Name="Fax" Type="String" />
        </ComplexType>
    </Schema>

    <Schema Namespace="CustomerComplexAddress.Store"
        Alias="Self" Provider="System.Data.SqlClient"
        ProviderManifestToken="2005"
        xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">

        <EntityContainer Name="dbo">
          <EntitySet Name="SCustomer" EntityType="CustomerComplexAddress.Store.SCustomer" />
        </EntityContainer>

        <EntityType Name="SCustomer">
          <Key>
            <PropertyRef Name="CustomerId" />
          </Key>
          <Property Name="CustomerId" Type="int" Nullable="false" />
          <Property Name="CompanyName" Type="nvarchar" MaxLength="50" />
          <Property Name="ContactName" Type="nvarchar" MaxLength="50" />
          <Property Name="ContactTitle" Type="nvarchar" MaxLength="50" />
          <Property Name="Address" Type="nvarchar" MaxLength="50" />
          <Property Name="City" Type="nvarchar" MaxLength="50" />
          <Property Name="Region" Type="nvarchar" MaxLength="50" />
          <Property Name="PostalCode" Type="nvarchar" MaxLength="50" />
          <Property Name="Country" Type="nvarchar" MaxLength="50" />
          <Property Name="Phone" Type="nvarchar" MaxLength="50" />
          <Property Name="Fax" Type="nvarchar" MaxLength="50" />
        </EntityType>
    </Schema>

    <Mapping Space="C-S"
        xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">

        <EntityContainerMapping StorageEntityContainer="dbo"
                  CdmEntityContainer="CustomerComplexAddressContext">

          <EntitySetMapping Name="CCustomers">
            <EntityTypeMapping
                 TypeName="CustomerComplexAddress.CCustomer">
              <MappingFragment StoreEntitySet="SCustomer">
                <ScalarProperty Name="CustomerId"
                                  ColumnName="CustomerId" />
                <ScalarProperty Name="CompanyName"
                                  ColumnName="CompanyName" />
                <ScalarProperty Name="ContactName"
                                  ColumnName="ContactName" />
                <ScalarProperty Name="ContactTitle"
                                  ColumnName="ContactTitle" />
               <ComplexProperty Name="Address"
                       TypeName="CustomerComplexAddress.CAddress">
                 <ScalarProperty Name="StreetAddress"
                                  ColumnName="Address" />
                 <ScalarProperty Name="City" ColumnName="City" />
                 <ScalarProperty Name="Region" ColumnName="Region" />
                 <ScalarProperty Name="PostalCode"
                                  ColumnName="PostalCode" />
                 <ScalarProperty Name="Country" ColumnName="Country" />
                 <ScalarProperty Name="Phone" ColumnName="Phone" />
                 <ScalarProperty Name="Fax" ColumnName="Fax" />
                </ComplexProperty>
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
       </EntityContainerMapping>
    </Mapping>


The following script can be used to create
    SQL Server storage model.

USE [master]
GO

CREATE DATABASE [CustomerComplexAddress] 
GO

USE [CustomerComplexAddress]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[SCustomer]') 
AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[SCustomer](
    [CustomerId] [int] NOT NULL,
     [CompanyName] [nvarchar](50) NULL,
     [ContactName] [nvarchar](50) NULL,
     [ContactTitle] [nvarchar](50) NULL,
    [Address] [nvarchar](50) NULL,
     [City] [nvarchar](50) NULL,
     [Region] [nvarchar](50) NULL,
     [PostalCode] [nvarchar](50) NULL,
     [Country] [nvarchar](50) NULL,
     [Phone] [nvarchar](50) NULL,
     [Fax] [nvarchar](50) NULL,
CONSTRAINT [PK_SCustomer] PRIMARY KEY CLUSTERED 
(
     [CustomerId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
   IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
   ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO

Vedere anche

Attività

Procedura: creare ed eseguire query di oggetto con tipi complessi (Entity Framework)
Procedura: aggiungere e modificare oggetti con tipi complessi (Entity Framework)

Concetti

Tipo complesso (EDM)