HOW TO:定義具有複雜類型的模型 (Entity Framework)
Entity Data Model (EDM) 中的複雜類型是含有內部結構但不含索引鍵屬性的資料型別。複雜類型可用來實作本身具有內部屬性的屬性。實體 (Entity) 或複雜類型都可以將某個屬性宣告成複雜類型。
複雜類型會在類似於實體類型的語法中宣告。主要差異在於複雜類型不包含索引鍵屬性的宣告,而實體中則有包含。在對應規格中,複雜類型會對應為複雜屬性。
若要實作複雜屬性
在 Visual Studio 的類別庫型別中建立專案,並加入 System.Data.Entity 和 System.Runtime.Serialization 的參考。
將新的 Entity Data Model 範本加入專案中。
實作概念結構定義語言 (CSDL) 結構描述,並將它加入到 EDM 範本所提供的 CSDL 檔案。此結構描述包含 CCustomer 實體的宣告以及其使用複雜類型 CAddress 的 Address 屬性。底下範例程式碼有顯示完整的結構描述。
針對在步驟 2 中建立的概念結構描述執行 edmgen.exe,以便建立物件程式碼。
實作存放結構定義語言 (SSDL) 結構描述,並將它加入到 EDM 範本所提供的 SSDL 檔案。在此結構描述中,複雜類型資料會儲存在與包含的實體相同的資料表中,如下列存放結構定義語言 (SSDL) 中繼資料內所示。底下範例程式碼有顯示完整的結構描述。
實作對應規格語言 (MSL) 結構描述,並將它加入到 EDM 範本所提供的 MSL 檔案。下列對應結構描述會顯示當做複雜屬性的 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
另請參閱
工作
HOW TO:使用複雜類型來建立和執行物件查詢 (Entity Framework)
HOW TO:加入及修改具有複雜類型的物件 (Entity Framework)