Share via


Procédure : définir un modèle avec des types complexes (Entity Framework)

Le type complexe du modèle Entity Data Model (EDM) est un type de données qui présente une structure interne, mais ne possède pas de propriété de clé. Il est utilisé pour implémenter une propriété qui possède ses propres propriétés internes. Une entité ou un type complexe peut être assorti d'une propriété déclarée en tant que type complexe.

Un type complexe est déclaré dans une syntaxe semblable à un type d'entité. La différence principale est qu'un type complexe n'inclut pas la déclaration d'une propriété de clé comme dans une entité. Dans la spécification de mappage, un type complexe est mappé en tant que propriété complexe.

Pour implémenter une propriété complexe

  1. Dans Visual Studio, créez un projet du type de bibliothèques de classes et ajoutez des références à System.Data.Entity et System.Runtime.Serialization.

  2. Ajoutez un nouveau modèle EDM (Entity Data Model) au projet.

  3. Implémentez le schéma CSDL (Conceptual Schema Definition Language) et ajoutez-le au fichier CSDL fourni par le modèle EDM. Le schéma inclut des déclarations de l'entité CCustomer et sa propriété Address qui utilise le type complexe CAddress. Le schéma complet est présenté dans l'exemple de code ci-dessous.

  4. Exécutez edmgen.exe sur le schéma conceptuel créé à l'étape 2 pour créer le code objet.

  5. Implémentez le schéma SSDL (Store Schema Definition Language) et ajoutez-le au fichier SSDL fourni par le modèle EDM. Dans ce schéma, les données du type complexe sont stockées dans la même table que l'entité conteneur, comme le montre les métadonnées SSDL (Store Schema Definition Language) suivantes. Le schéma complet est présenté dans l'exemple de code ci-dessous.

  6. Implémentez le schéma MSL (Mapping Specification Language) et ajoutez-le au fichier MSL fourni par le modèle EDM. Le schéma de mappage ci-dessous représente le mappage de Address en tant que propriété complexe. La spécification de mappage complète est présentée dans l'exemple de code ci-dessous.

Exemple

Les trois schémas requis sont présentés les uns à la suite des autres dans le code XML ci-dessous. Un script qui peut être utilisé pour créer la base de données utilisée pour le stockage dans cet exemple est fourni à la suite du code.

    <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

Voir aussi

Tâches

Procédure : créer et exécuter des requêtes d'objet avec des types complexes (Entity Framework)
Procédure : ajouter et modifier des objets avec des types complexes (Entity Framework)

Concepts

Type complexe (EDM)