實作實體 (EDM)
在所有 實體資料模型 (EDM) 應用程式中,實體會定義於概念結構定義語言 (CSDL) 中,並對應到描述存放結構定義語言 (SSDL) 中資料結構的中繼資料。此範例會示範如何設計單一實體及將它對應到儲存區。
設計此範例實體所針對的應用程式會定義企業中有關員工的資訊。
概念結構描述
下列概念結構定義語言 (CSDL) 語法內定義的實體包含 Namespace (名稱為 Employes
) 中資料型別的規格。Namespace 包含單一 EntityType 宣告:Employees
。
Employees
實體的屬性包含用來識別員工的基本資訊。EmployeeId
屬性會宣告為可唯一識別此型別之執行個體的 Guid。EmployeeId
屬性會標記為索引鍵。
其他三個屬性會依據 FirstName
、LastName
和 Email
address 來識別員工。
除了實體規格以外,CSDL 結構描述也包含 EntitySet 和 EntityContainer 宣告。EntityContainer 和 EntitySet 規格會定義資料模型中資料型別的範圍。EntityContainer 包含 EntitySet。在這個範例中,名為 Employees
的 EntitySet 包含 Employee
型別。
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="Employees" Alias="Self" xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
<EntityContainer Name="EmployeesContext">
<EntitySet Name="Employees" EntityType="Employees.Employees" />
</EntityContainer>
<EntityType Name="Employees">
<Key>
<PropertyRef Name="EmployeeId" />
</Key>
<Property Name="EmployeeId" Type="Guid" Nullable="false" />
<Property Name="LastName" Type="String" Nullable="false" />
<Property Name="FirstName" Type="String" Nullable="false" />
<Property Name="Email" Type="String" Nullable="false" />
</EntityType>
</Schema>
Namespace 結構描述包含 Employee
實體及所有集合,但是 EntityContainer 除外 (它與 Namespace 結構描述無關,而且兩者是分開的)。如需 EntityContainer 的詳細資訊,請參閱 EntityContainerMapping 項目 (MSL)。
此資料模型上建置的應用程式會參考 Namespace,以便使用此模型上建置的類別。
這個 CSDL 規格稱為概念或設計結構描述。SSDL 語法中儲存中繼資料內的平行實體名稱會對應到儲存結構。這個 CSDL 結構描述內的 EntitySet 對應至 SSDL 結構描述內指定的資料表名稱。此資料表包含此模型上建置之應用程式所使用之 Employee
實體執行個體的資料。Employee
實體的屬性對應至資料表的資料行。
存放結構描述
SSDL 中的儲存區中繼資料說明資料庫,其中包含概念結構描述內定義的 Employees
執行個體。
下列結構描述中定義的 Employees.Store
命名空間是已經在概念結構描述中定義之 Employees
模型的目標資料庫。
此結構描述內的 EntitySetEmployees
表示名為 Employees
的資料表。此結構描述指定的 EntityType 對應到概念結構描述內定義的 EntityType。儲存中繼資料內的名稱不需要符合概念結構描述中的名稱,但是它必須符合資料庫資料表的名稱。
下列結構描述說明 SSDL 檔案中指定之 EntityContainer 所表示的 dbo
資料庫物件。這個範例中的 EntityContainer 包含一個名為 Employees
的資料表。
?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="Employees.Store" Alias="Self"
Provider="System.Data.SqlClient"
ProviderManifestToken="2005"
xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
<EntityContainer Name="dbo">
<EntitySet Name="Employees" EntityType="Employees.Store.Employees" />
</EntityContainer>
<EntityType Name="Employees">
<Key>
<PropertyRef Name="EmployeeId" />
</Key>
<Property Name="EmployeeId" Type="uniqueidentifier" Nullable="false" />
<Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" />
<Property Name="FirstName" Type="nvarchar" Nullable="false" />
<Property Name="Email" Type="nvarchar" Nullable="false" />
</EntityType>
</Schema>
對應規格
對應規格會定義在對應規格語言 (MSL) 中。這個 MSL 規格會將 CSDL 結構描述連接到使用 SSDL 結構描述內中繼資料的資料庫。
這個 MSL 結構描述的項目包括 EntityContainerMapping、StorageEntityContainer、EntityTypeMapping、MappingFragment 和 ScalarProperty 對應。EntityContainerMapping 會將 CdmEntityContainer 對應至 StorageEntityContainer,在此案例中,也就是將 EmployeeSkills
實體容器對應至 dbo
資料庫物件。
請注意,結構描述命名空間不會限定指派給 StorageEntityContainer 和 CdmEntityContainer 的名稱。StorageEntityContainer 和 CdmEntityContainer 結構描述項目在概念結構描述及儲存區中繼資料內是各自分開而且獨立。使用命名空間名稱限定 StorageEntityContainer 和 CdmEntityContainer 名稱將導致發生對應例外狀況 (Exception)。
在****StorageEntityContainer 和 CdmEntityContainer 對應後面,EntitySetMapping 會指定 StoreEntitySet,它對應至概念
TypeName,Employees
。
TypeName 的屬性是由 ScalarProperty 項目所對應,當做對應於 ColumnName 項目的 Name 屬性,例如 Name="EmployeeId" ColumnName="EmployeeId"
。Name 語法會指定概念結構描述中實體的屬性,而 ColumnName 會指定目標資料庫中 Employees
資料表的資料行。
<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S"
xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping StorageEntityContainer="dbo"
CdmEntityContainer="EmployeesContext">
<EntitySetMapping Name="Employees" StoreEntitySet="Employees"
TypeName="Employees.Employees">
<ScalarProperty Name="EmployeeId" ColumnName="EmployeeId" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="Email" ColumnName="Email" />
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>