Freigeben über


Gewusst wie: Definieren eines Modells mit komplexen Typen (Entity Framework)

Im Entity Data Model (EDM) ist der komplexe Typ ein Datentyp mit interner Struktur, jedoch ohne Schlüsseleigenschaft. Der komplexe Typ wird zum Implementieren von Eigenschaften verwendet, die eigene interne Eigenschaften besitzen. Sowohl eine Entität als auch ein komplexer Typ kann eine Eigenschaft besitzen, die als komplexer Typ deklariert ist.

Ein komplexer Typ wird mit einer ähnlichen Syntax wie ein Entitätstyp deklariert. Der Hauptunterschied besteht darin, dass im komplexen Typ die Deklaration einer Schlüsseleigenschaft nicht wie in einer Entität enthalten ist. In der Mapping-Spezifikation wird ein komplexer Typ als komplexe Eigenschaft zugeordnet.

So implementieren Sie eine komplexe Eigenschaft

  1. Erstellen Sie in Visual Studio ein Projekt vom Typ "Klassenbibliothek", und fügen Sie Verweise auf System.Data.Entity und System.Runtime.Serialization hinzu.

  2. Fügen Sie dem Projekt eine neue Entity Data Model-Vorlage hinzu.

  3. Implementieren Sie das CSDL-Schema, und fügen Sie es der CSDL-Datei hinzu, die durch die EDM-Vorlage bereitgestellt wurde. Das Schema enthält Deklarationen der CCustomer-Entität und deren Address-Eigenschaft, die den komplexen CAddress-Typ verwendet. Das vollständige Schema ist im folgenden Beispielcode dargestellt.

  4. Führen Sie edmgen.exe für das in Schritt 2 erstellte konzeptionelle Schema aus, um den Objektcode zu erstellen.

  5. Implementieren Sie das SSDL-Schema, und fügen Sie es der von der EDM-Vorlage bereitgestellten SSDL-Datei hinzu. In diesem Schema werden die Daten des komplexen Typs in derselben Tabelle gespeichert wie die enthaltende Entität. Dies wird aus den im Folgenden dargestellten SSDL-Metadaten ersichtlich. Das vollständige Schema ist im folgenden Beispielcode dargestellt.

  6. Implementieren Sie das MSL-Schema, und fügen Sie es der MSL-Datei hinzu, die durch die EDM-Vorlage bereitgestellt wurde. Im folgenden Mapping-Schema wird das Mapping von Address als komplexe Eigenschaft dargestellt. Die vollständige Mapping-Spezifikation ist im folgenden Beispielcode dargestellt.

Beispiel

Die drei erforderlichen Schemas sind hier hintereinander im XML-Format dargestellt. Nach dem Code wird ein Skript bereitgestellt, das verwendet werden kann, um die in diesem Beispiel für die Speicherung verwendete Datenbank zu erstellen.

    <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

Siehe auch

Aufgaben

Gewusst wie: Erstellen und Ausführen von Objektabfragen mit komplexen Typen (Entity Framework)
Gewusst wie: Hinzufügen und Ändern von Objekten mit komplexen Typen (Entity Framework)

Konzepte

Komplexer Typ (EDM)