Share via


2 つのテーブルにマップされた単一のエンティティでモデルを定義する方法

Entity Data Model (EDM) でレガシ データを使用するとき、単一のエンティティをデータベース内の 2 つのテーブルにマップできると便利な場合があります。これは、SQL Server 2005 に付属する AdventureWorks サンプル データベースの Customer テーブルと Store テーブルのように、2 つのテーブルが共通のキーを共有している場合に実現できます。

AdventureWorks データベースの Customer テーブルと Store テーブルを使用した EDM を作成し、次のセクションに従って *.edmx ファイルに変更を加えます。このデータ モデルをテストするには、「別個のテーブルにマップされたエンティティを使ってオブジェクト クエリを作成および実行する方法」のトピックで紹介したコードを使用します。

概念スキーマ定義言語 (CSDL) の要件を実装するには

  1. *.edmx ファイルの <edmx:ConceptualModels> セクションを探します。

  2. Customer エンティティを表す <EntityType> タグを削除します。

  3. <Key> タグと <PropertyRef> タグを削除し、さらに、先ほど削除した Customer エンティティの名前と識別子 (StoreID) を削除します。

  4. 削除した Customer エンティティのプロパティを Store エンティティの <EntityType> タグ内に移動します。

  5. 先ほど削除した Customer エンティティの rowguid プロパティの名前を Cust_rowguid に変更します。

  6. 先ほど削除した Customer エンティティの ModifiedDate プロパティの名前を Cust_ModifiedDate に変更します。

  7. この概念スキーマを次に示します。

   <edmx:ConceptualModels>
      <Schema Namespace="AdventureWorksModel" Alias="Self"
            xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
        <EntityContainer Name="AdventureWorksEntities">
          
          <EntitySet Name="Store"
              EntityType="AdventureWorksModel.Store" />
        </EntityContainer>
        
        <EntityType Name="Store">
          <Key>
            <PropertyRef Name="CustomerID" />
          </Key>
          <Property Name="CustomerID" Type="Int32" Nullable="false" />
          <Property Name="Name" Type="String" 
                  Nullable="false" MaxLength="50" />
          <Property Name="SalesPersonID" Type="Int32" />
          <Property Name="Demographics" Type="String"
                     MaxLength="1073741823" />
          <Property Name="rowguid" Type="Guid" Nullable="false" />
          <Property Name="ModifiedDate" Type="DateTime"
                     Nullable="false" />
          
          <Property Name="TerritoryID" Type="Int32" />
          <Property Name="AccountNumber" Type="String" 
                  Nullable="false" 
                    MaxLength="10" Unicode="false" />
          <Property Name="CustomerType" Type="String" 
                  Nullable="false" 
                    MaxLength="1" FixedLength="true" />
          <Property Name="Cust_rowguid" Type="Guid" 
                  Nullable="false" />
          <Property Name="Cust_ModifiedDate" Type="DateTime"
                  Nullable="false" />
        </EntityType>
        
      </Schema>
    </edmx:ConceptualModels>

ストア スキーマ定義言語 (SSDL) の要件を実装するには

  1. *.edmx ファイルの <edmx:StorageModels> セクションを探します。

  2. 次に示すように、SSDL スキーマには変更を加えません。

    <edmx:StorageModels>
      <Schema Namespace="AdventureWorksModel.Store" Alias="Self"
          Provider="System.Data.SqlClient"
          ProviderManifestToken="2005"
          xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
        <EntityContainer Name="Sales">
          <EntitySet Name="Customer"
                EntityType="AdventureWorksModel.Store.Customer" />
          <EntitySet Name="Store"
              EntityType="AdventureWorksModel.Store.Store" />
          <AssociationSet Name="FK_Store_Customer_CustomerID"
  Association="AdventureWorksModel.Store.FK_Store_Customer_CustomerID">
            <End Role="Customer" EntitySet="Customer" />
            <End Role="Store" EntitySet="Store" />
          </AssociationSet>
        </EntityContainer>
        <EntityType Name="Customer">
          <Key>
            <PropertyRef Name="CustomerID" />
          </Key>
          <Property Name="CustomerID" Type="int" 
                Nullable="false" StoreGeneratedPattern="Identity" />
          <Property Name="TerritoryID" Type="int" />
          <Property Name="AccountNumber" Type="varchar"
                           Nullable="false" MaxLength="10" />
          <Property Name="CustomerType" Type="nchar" 
                Nullable="false" MaxLength="1" />
          <Property Name="rowguid" 
                    Type="uniqueidentifier" Nullable="false" />
          <Property Name="ModifiedDate" Type="datetime"
                Nullable="false" />
        </EntityType>
        <EntityType Name="Store">
          <Key>
            <PropertyRef Name="CustomerID" />
          </Key>
          <Property Name="CustomerID" Type="int" Nullable="false" />
          <Property Name="Name" Type="nvarchar" 
                Nullable="false" MaxLength="50" />
          <Property Name="SalesPersonID" Type="int" />
          <Property Name="Demographics" Type="xml" />
          <Property Name="rowguid" Type="uniqueidentifier"
                Nullable="false" />
          <Property Name="ModifiedDate" Type="datetime"
                         Nullable="false" />
        </EntityType>
        <Association Name="FK_Store_Customer_CustomerID">
          <End Role="Customer"
        Type="AdventureWorksModel.Store.Customer" Multiplicity="1" />
          <End Role="Store" Type="AdventureWorksModel.Store.Store"
                Multiplicity="0..1" />
          <ReferentialConstraint>
            <Principal Role="Customer">
              <PropertyRef Name="CustomerID" />
            </Principal>
            <Dependent Role="Store">
              <PropertyRef Name="CustomerID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
      </Schema>
    </edmx:StorageModels>

マッピング スキーマ言語 (MSL) の要件を実装するには

  1. *.edmx ファイルの <edmx:Mappings> セクションを探します。

  2. マッピング スキーマから、Customer エンティティ セットの <EntitySetMapping> タグを削除します。

  3. マッピング スキーマから、Customer エンティティ型の <EntityTypeMapping> タグを削除します。

  4. Customer の StoreEntitySet の <MappingFragment> を StoreEntitySet の EntityType マッピング内に移動します。

  5. このマッピング スキーマを次に示します。

    <edmx:Mappings>
      <Mapping Space="C-S"
          xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
        <EntityContainerMapping StorageEntityContainer="Sales"
          CdmEntityContainer="AdventureWorksEntities">
          
          <EntitySetMapping Name="Store">
            <EntityTypeMapping
                 TypeName="IsTypeOf(AdventureWorksModel.Store)">
              <MappingFragment StoreEntitySet="Store">
                <ScalarProperty Name="CustomerID"
                           ColumnName="CustomerID" />
                <ScalarProperty Name="Name" ColumnName="Name" />
                <ScalarProperty Name="SalesPersonID"
                           ColumnName="SalesPersonID" />
                <ScalarProperty Name="Demographics"
                           ColumnName="Demographics" />
                <ScalarProperty Name="rowguid"
                           ColumnName="rowguid" />
                <ScalarProperty Name="ModifiedDate"
                           ColumnName="ModifiedDate" />
              </MappingFragment>
              <MappingFragment StoreEntitySet="Customer">
                <ScalarProperty Name="CustomerID"
                           ColumnName="CustomerID" />
                <ScalarProperty Name="TerritoryID"
                           ColumnName="TerritoryID" />
                <ScalarProperty Name="AccountNumber"
                           ColumnName="AccountNumber" />
                <ScalarProperty Name="CustomerType"
                           ColumnName="CustomerType" />
                <ScalarProperty Name="Cust_rowguid"
                           ColumnName="rowguid" />
                <ScalarProperty Name="Cust_ModifiedDate"
                           ColumnName="ModifiedDate" />
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
          
        </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>

参照

処理手順

別個のテーブルにマップされたエンティティを使ってオブジェクト クエリを作成および実行する方法