Share via


スキーマ (EDM)

エンティティ データ モデル (EDM) スキーマは、エンティティとリレーションシップの型を表す XML テキスト ファイルです。また、スキーマではそれらの型のインスタンスが論理的に整理されるコンテナも定義されます。EDM のエンティティとアソシエーションにより、エンティティ フレームワーク でインストールされる基本的な型と開発者の設計した型の両方が定義されます。

デザイン スキーマは概念スキーマ定義言語 (CSDL) で作成されます。ストア スキーマ定義言語 (SSDL) で作成されるもう 1 つのスキーマにより、EDM を使用するアプリケーション用のストレージ モデルが定義されます。

このトピックでは、CSDL で作成されるデザイン スキーマについて説明します。ストレージ メタデータおよびマッピング スキーマの詳細については、「スキーマおよびマッピング スキーマ (Entity Framework)」を参照してください。

スキーマの最上位の要素では、名前の一意性が規則として適用される名前空間が割り当てられます。次の省略形のスキーマで定義される型は、MyCompany.LOBSchema 名前空間に論理的に分類されます。この名前空間は、クラスとプロシージャ コードを含むオブジェクト指向プログラミングにおける名前空間と似ています。EDM では、プロシージャが定義されません。EDM におけるプロシージャの実装については、「ヘルパ メソッド (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 タグで定義できるため、完全修飾の構文を使用せずに定義された名前空間でも外部スキーマの既存の型を使用できます。

完全なスキーマでは、エンティティの宣言にプロパティが含まれます。そのプロパティの 1 つには、Key プロパティが指定されます。EntityTypeKey 属性により、エンティティの 1 つ以上のプロパティが Key に指定されます。Key は、複数のプロパティの複合プロパティとすることもできます。Key により、すべての操作についてエンティティのインスタンスが一意に識別されます。

次の例では、開始タグ EntityType 内でエンティティに Name 属性が割り当てられた後、Key 属性が CustomerId に割り当てられます。CustomerIdKey プロパティの Type 属性は、Key に一意な値を指定するために Guid に設定されます。この CSDL セグメントの 2 行目で、CustomerId プロパティが宣言されます。

    <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 プロパティの TypeString を割り当てています。Title プロパティは、顧客の肩書きを表します。制約で Nullability="false" が指定されているため、Title プロパティは Null に設定できません。String 型の Title プロパティの Default 属性が "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 が定義されている場合でも、EntityContainer 要素は Schema 要素から独立しています。これは、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 の宣言には、これまでに示したコード セグメントで定義されたすべてのエンティティとアソシエーションが、EntitySet タグと AssociationSet タグで指定されたセットの形で含まれています。

このスキーマの指定をデータ型として実装する場合、Customer または Order の各インスタンスが、適切な EntitySet のメンバとなります。このエンティティ コンテナでは、Customer エンティティと Order エンティティのセットに、それぞれの複数形である Customers および Orders という名前が付けられます。開発者は、独自の名前付け規則を定義できます。名前と、ストレージ メタデータおよびマッピング スキーマにおける名前との対応関係については、「スキーマおよびマッピング スキーマ (Entity Framework)」を参照してください。

前の EntityContainer 宣言内の AssociationSet タグにより、Customer_Orders という名前のアソシエーション セットが指定されます。このアソシエーション セットには、Customer_Order アソシエーションのインスタンスが含まれます。

これらの要素 (EntityTypeEntitySetAssociationAssociationSet、および EntityContainer) を組み合わせることで、スキーマの基本構造が形成されます。スキーマでの宣言に関する各行の詳細については、「スキーマおよびマッピング スキーマ (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)