Поделиться через


Как определить модель со сложным типом (платформа Entity Framework)

Сложный тип в модели EDM — это тип данных с внутренней структурой, но без ключевого свойства. Сложный тип используется для реализации свойства, которое обладает собственными внутренними свойствами. Сущность или сложный тип может иметь свойство, объявленное как сложный тип.

Синтаксис объявления сложного типа напоминает синтаксис типа сущности. Основное отличие в том, что сложный тип не содержит декларации ключевого свойства. В спецификации сопоставления сложный тип сопоставляется в качестве сложного свойства.

Реализация сложного свойства

  1. В среде Visual Studio создайте проект типа библиотеки классов и добавьте ссылки на System.Data.Entity и System.Runtime.Serialization.

  2. Добавьте в проект шаблон модели EDM.

  3. Реализуйте концептуальную схему на языке CSDL и добавьте ее в файл CSDL шаблона модели EDM. Схема включает декларации сущности CCustomer и его свойства Address, использующего сложный тип CAddress. В следующем примере кода показана полная схема.

  4. Запустите edmgen.exe для концептуальной схемы, созданной на шаге 2, чтобы создать объектный код.

  5. Реализуйте схему хранения на языке SSDL и добавьте ее в файл SSDL, предоставляемый шаблоном EDM. В этой схеме данные сложного типа хранятся в той же таблице, что и содержащая сущность, как показано в метаданных хранилища на языке SSDL. В следующем примере кода показана полная схема.

  6. Реализуйте схему на языке MSL и добавьте ее в MSL-файл, предоставленный шаблоном модели EDM. В следующей схеме показано сопоставление свойства Address как сложного свойства. В следующем примере кода показана полная спецификация сопоставления.

Примеры

В следующем XML-коде показаны по порядку все три необходимые схемы. После этого кода приведен сценарий, с помощью которого можно создать базу данных, используемую в этом примере.

    <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

См. также

Задачи

Как создавать и выполнять запросы объектов со сложными типами (Entity Framework)
Как добавить и изменить объекты со сложными типами (платформа Entity Framework)

Основные понятия

Сложный тип (модель EDM)