結構描述 (EDM)

實體資料模型 (EDM) 結構描述是描述實體與關聯性型別的 xml 文字檔。此結構描述也會定義一個容器,在此容器中,這些型別的執行個體是以邏輯方式組織。EDM 中的實體和關聯同時定義了隨 實體架構 安裝的基本型別以及開發人員設計的型別。

設計結構描述是使用概念結構定義語言 (CSDL) 所撰寫。使用存放結構定義語言 (SSDL) 撰寫的第二個結構描述會針對使用 EDM 的應用程式定義儲存體模型。

本主題將描述使用 CSDL 撰寫的設計結構描述。如需儲存中繼資料和對應結構描述的詳細資訊,請參閱結構描述和對應規格 (Entity Framework)

結構描述中的最上層項目會指派一個命名空間,此命名空間中會套用名稱唯一性規則。下列縮寫的結構描述中所定義的型別在邏輯上會組織於 MyCompany.LOBSchema 命名空間底下。此命名空間類似於包含類別和程序程式碼之物件導向程式設計中的命名空間。EDM 不會定義程序。如需在 EDM 中實作程序的詳細資訊,請參閱 Helper 方法 (EDM)

下列結構描述中定義的每一個實體與關聯都有完整名稱,例如 MyCompany.LOBSchema.Customer。針對 MyCompany.LOBSchema 命名空間宣告的 Self 別名會縮短此範例中的完整名稱,如同 Self.Customer 中的使用方式一樣。

實體和關聯會定義在結構描述的主體內。此範例中所定義之實體的屬性會予以省略,以顯示 CSDL 結構描述的整體結構。

<?xml version="1.0" encoding="utf-8"?>
<Schema xmlns="https://schemas.microsoft.com/ado/2006/04/edm" 
        Namespace="MyCompany.LOBSchema" Alias="Self">

    <Documentation>
      <Summary>Conceptual schema (csdl)</Summary>
      <LongDescription>This schema is an example showing 
        general syntax.</LongDescription>
    </Documentation>

    <EntityType Name="Customer">
        <Key>
            <PropertyRef Name="CustomerId" />
        </Key>
        <Property Name="CustomerId" Type="Guid" Nullable="false" />
        <!-- Other properties-->
    </EntityType>

    <EntityType Name="Order">
        <Key>
            <PropertyRef Name="OrderId" />
        </Key>
        <Property Name="OrderId" Type="Guid" Nullable="false" />
        <!-- Other properties-->
    </EntityType>

    <Association Name="Customer_Order">
        <End Role="Customer" Type="Self.Customer" Multiplicity="0..1" />
        <End Role="Order" Type="Self.Order" Multiplicity="*" />
    </Association>

    <EntityContainer Name="LOBSchemaData">
        <EntitySet Name="Customers" EntityType="Self.Customer" />
        <EntitySet Name="Orders" EntityType="Self.Order" />
        <AssociationSet Name="Customer_Orders" Association="Self.Customer_Order">
            <End Role="Customer" EntitySet="Customers" />
            <End Role="Order" EntitySet="Orders" />
        </AssociationSet>
    </EntityContainer>
</Schema>

另一個 CSDL 檔案中所定義之結構描述的別名可以使用 Using 標記來定義,因此不需要完整的語法就可以在命名空間中使用外部結構描述內的現有類型。

在完整結構描述中,實體宣告包含屬性。Key 屬性是其中一個被指派的屬性。 EntityTypeKey 屬性 (Attribute) 會將實體的一個或多個屬性 (Property) 指定為 KeyKey 可以是多個屬性混合而成的。Key 會對所有作業進行唯一識別實體的執行個體。

下列範例的開頭EntityType 標記中,Name 屬性已指派給實體之後,就會指派 CustomerIdKey 屬性。CustomerIdKey 屬性 (Property) 的 Type 屬性 (Attribute) 是設為 Guid,以便指定 Key 的唯一值。CustomerId 屬性 (Property) 的宣告接在這個 CSDL 區段的第二行之後。

    <EntityType Name="Customer" >
        <Key>
            <PropertyRef Name="CustomerId" />
        </Key>
        <Property Name="CustomerId" Type="Guid" Nullable="false" />
        <Property Name="Title" Type="String" Nullable="false" />
    </EntityType>

這個範例的最後一行宣告名為 Title 的屬性,並將 Title 屬性的 Type 指派為 StringTitle 屬性可識別客戶的工作角色,但是 Title 屬性不能為 Null (由 Nullability="false" 限制式指定)。Title 屬性 (Property) 之 String 型別的 Default 屬性 (Attribute) 是設為 "NewHire"

可以指定複合索引鍵,如下列範例所示。

<EntityType Name="EmployeePayHistory">
    <Key>
      <PropertyRef Name="EmployeeID" />
      <PropertyRef Name="RateChangeDate" />
    </Key>
    <Property Name="EmployeeID" Type="Int32" Nullable="false" />
    <Property Name="RateChangeDate" Type="DateTime" Nullable="false"/>
    <Property Name="Rate" Type="Decimal" Nullable="false"/>
    <Property Name="PayFrequency" Type="Boolean" Nullable="false" />
    <Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
    <NavigationProperty Name="Employee"
Relationship="Adventureworks.FK_EmployeePayHistory_Employee_EmployeeID"
 FromRole="EmployeePayHistory" ToRole="Employee" />
  </EntityType>

實體容器

使用 EDM 的結構描述會定義實體容器,以指定定義之命名空間中可用的資料型別集合。實體容器是可程式化物件模型中命名空間的基礎 (此物件模型將會從 CSDL 結構描述建置而來)。

在 xml 階層中,EntityContainer 項目和 Schema 項目是分開的,即使在結構描述內定義 EntityContainer 也一樣。對於將 EntityContainer 對應至儲存區來說,這一點非常重要。概念結構描述內的EntityContainer 標記會對應至儲存體中繼資料內對應的EntityContainer 標記。請注意,在對應檔中 EntityContainer 的完整名稱並不包含結構描述命名空間名稱。

實體集會塑造可程式化物件模型的類別。關聯集會定義關聯性的範圍。如需實體集和關聯集的詳細資訊,請參閱實體集 (EDM)關聯集 (EDM)

下列結構描述區段包含 MyCompany.LOBSchema 命名空間中 LOBSchemaData 命名空間的EntityContainer 宣告。

    <EntityContainer Name="LOBSchemaData">
        <EntitySet Name="Customers" EntityType="Self.Customer"/>
        <EntitySet Name="Orders" EntityType="Self.Order"/>
        <AssociationSet Name="Customer_Orders" 
                          Association="Self.Customer_Order">
            <End Role="Customer" EntitySet="Customers"/>
            <End Role="Order" EntitySet="Orders"/>
        </AssociationSet>
    </EntityContainer>

這個EntityContainer 宣告包含前述程式碼區段中定義的所有實體和關聯,現在的形式為 EntitySetAssociationSet 標記指定的集合。

當這個結構描述的規格是實作成資料型別時,CustomerOrder 的每一個執行個體都將是適當 EntitySet 的成員。此實體容器會以複數命名的形式定義 CustomerOrder 實體的集合:CustomersOrders。開發人員可以定義自己的命名慣例。如需這些名稱如何對應到儲存中繼資料內的名稱及對應規格的詳細資訊,請參閱結構描述和對應規格 (Entity Framework)

之前 EntityContainer 宣告中的 AssociationSet 標記會指定名為 Customer_Orders 的關聯集。此關聯集包含 Customer_Order 關聯的執行個體。

這些項目 (EntityTypeEntitySetAssociationAssociationSetEntityContainer) 會結合在一起,以形成結構描述的基本結構。如需結構描述內有關宣告的逐行資訊,請參閱結構描述和對應規格 (Entity Framework)

部署

EDM 規格不會指定在 CSDL 中定義實體類型之後所使用的儲存體模型。在大多數常見的案例中,資料來源是關聯式資料庫管理系統 (RDBMS)。儲存體模型的部署需要建立對應至結構描述中所定義之實體的資料庫和資料表。實作也可能需要資料表和 (或) 連結資料表中的外部索引鍵,才能支援關聯。

EDM 可以搭配現有的資料庫使用,其方式是將資料庫和資料表對應到 EDM 型別。現有的程式設計物件模型也可以對應到 EDM 型別。

另請參閱

概念

Entity Data Model 關聯性
Entity Data Model 類型
EntityType 項目 (CSDL)
EntitySet 項目 (EntityContainer CSDL)
Association 項目 (CSDL)
AssociationSet 項目 (EntityContainer CSDL)
EntityContainer 項目 (CSDL)

其他資源

結構描述和對應規格 (Entity Framework)