將概念模型對應到儲存結構描述
實體架構 提供以物件為中心的表格式資料檢視,以實體類型表示。應用程式開發人員只須針對從概念模型產生的物件模型來考慮程式設計,不必另外考慮資料庫結構描述,以及如何存取資料庫物件並將它們轉換成程式設計物件。實體架構 使用模型結構描述和對應將針對實體的建立、讀取、更新及刪除作業轉換成資料來源中的對等作業。
附註 |
---|
本節中顯示的所有對應檔案片段都是由 EDM 產生器 (EdmGen.exe) 工具產生的。 |
概念模型
概念模型是定義 EDM 中實體及關聯的 實體資料模型 (EDM) 結構描述。定義此模型的 XML 語法稱為概念結構定義語言 (CSDL)。以 CSDL 定義的實體類型具有名稱、用於明確識別執行個體的索引鍵,和一組屬性。指派給屬性的資料型別會指定為簡單型別 (純量屬性) 或複雜類型 (由一或多個純量或複雜屬性構成的型別)。有些額外屬性也可用來指定 Null 屬性或指派預設值。關聯 (Association) 會定義實體之間的關聯性。實體架構 語言項目和專有名詞的詳細說明請參閱 Entity Framework 詞彙。
下列 XML 片段表示 School EDM 概念模型的一部分,此模型定義由 FK_Course_Department 關聯所聯結並移除其他實體和關聯的 Course 和 Department 實體類型。
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel" Alias="Self"
xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
<EntityContainer Name="SchoolEntities">
<EntitySet Name="Course" EntityType="SchoolModel.Course" />
<EntitySet Name="Department" EntityType="SchoolModel.Department" />
...
<AssociationSet Name="FK_Course_Department"
Association="SchoolModel.FK_Course_Department">
<End Role="Department" EntitySet="Department" />
<End Role="Course" EntitySet="Course" />
</AssociationSet>
...
</EntityContainer>
<EntityType Name="Course">
<Key>
<PropertyRef Name="CourseID" />
</Key>
<Property Name="CourseID" Type="Int32" Nullable="false" />
<Property Name="Title" Type="String" Nullable="false"
MaxLength="100" Unicode="true" FixedLength="false" />
...
<NavigationProperty Name="Department"
Relationship="SchoolModel.FK_Course_Department"
FromRole="Course" ToRole="Department" />
...
</EntityType>
<EntityType Name="Department">
<Key>
<PropertyRef Name="DepartmentID" />
</Key>
<Property Name="DepartmentID" Type="Int32" Nullable="false" />
<Property Name="Name" Type="String" Nullable="false" MaxLength="50"
Unicode="true" FixedLength="false" />
...
<NavigationProperty Name="Course" Relationship="SchoolModel.FK_Course_Department"
FromRole="Department" ToRole="Course" />
</EntityType>
...
<Association Name="FK_Course_Department">
<End Role="Department" Type="SchoolModel.Department" Multiplicity="1" />
<End Role="Course" Type="SchoolModel.Course" Multiplicity="*" />
</Association>
...
</Schema>
儲存模型
另一個資料模型使用存放結構定義語言 (SSDL) 來描述使用於永續性資料 (通常儲存在關聯式資料庫中) 的邏輯模型。SSDL 檔案中所宣告屬性的資料型別就是儲存模型的資料型別。這個儲存模型片段所示為 School 資料庫中由 FK_Course_Department 外部索引鍵關聯並移除其他實體後之 Course 和 Department 資料表的儲存中繼資料範例。
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel.Store" Alias="Self"
Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
<EntityContainer Name="dbo">
<EntitySet Name="Course" EntityType="SchoolModel.Store.Course"
store:Type="Tables" />
<EntitySet Name="Department"
EntityType="SchoolModel.Store.Department" store:Type="Tables" />
...
<AssociationSet Name="FK_Course_Department"
Association="SchoolModel.Store.FK_Course_Department">
<End Role="Department" EntitySet="Department" />
<End Role="Course" EntitySet="Course" />
</AssociationSet>
...
</EntityContainer>
<EntityType Name="Course">
<Key>
<PropertyRef Name="CourseID" />
</Key>
<Property Name="CourseID" Type="int" Nullable="false" />
<Property Name="Title" Type="nvarchar" Nullable="false"
MaxLength="100" />
...
</EntityType>
<EntityType Name="Department">
<Key>
<PropertyRef Name="DepartmentID" />
</Key>
<Property Name="DepartmentID" Type="int" Nullable="false" />
<Property Name="Name" Type="nvarchar" Nullable="false"
MaxLength="50" />
...
</EntityType>
...
<Association Name="FK_Course_Department">
<End Role="Department" Type="SchoolModel.Store.Department"
Multiplicity="1" />
<End Role="Course" Type="SchoolModel.Store.Course" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Department">
<PropertyRef Name="DepartmentID" />
</Principal>
<Dependent Role="Course">
<PropertyRef Name="CourseID" />
</Dependent>
</ReferentialConstraint>
</Association>
...
</Schema>
對應規格
對應規格使用對應規格語言 (MSL) 將概念模型中宣告的型別連接到儲存模型中宣告的資料庫中繼資料。這個 MSL 片段示範 School 模型中 Course 和 Department 實體的概念模型與儲存模型之間的一對一對應。
<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S"
xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping StorageEntityContainer="dbo"
CdmEntityContainer="SchoolEntities">
<EntitySetMapping Name="Course">
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Course)">
<MappingFragment StoreEntitySet="Course">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
<ScalarProperty Name="Title" ColumnName="Title" />
...
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="Department">
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Department)">
<MappingFragment StoreEntitySet="Department">
<ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
<ScalarProperty Name="Name" ColumnName="Name" />
...
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
...
<AssociationSetMapping Name="FK_Course_Department"
TypeName="SchoolModel.FK_Course_Department"
StoreEntitySet="Course">
<EndProperty Name="Department">
<ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
</EndProperty>
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
</EndProperty>
<Condition ColumnName="DepartmentID" IsNull="false" />
</AssociationSetMapping>
...
</cs:EntityContainerMapping>
</Mapping>
討論
這裡所討論的 School 模型在概念實體與資料庫資料表之間使用簡單的一對一對應,不過 實體架構 可支援較複雜的對應。例如,關聯式資料庫可能會使用多個資料表來儲存與每一員工相關的資料。一個資料表可能包含所有人的連絡資訊,而另一個關聯的資料表可能包含僅與員工相關的某些資訊。實體架構 可以讓開發人員使用繼承階層架構定義實體,並且將一個實體對應到來自資料庫中的多個資料表的資料,並且完全支援資料更新、插入和刪除。如需詳細資訊,請參閱 Entity Framework 中的資料模型化。
另請參閱
概念
其他資源
使用者入門 (Entity Framework)
EDM 規格
定義進階資料模型 (Entity Framework 工作)
結構描述和對應規格 (Entity Framework)