手順 4 (省略可能) : 関連付けを定義する

関連付けは、基幹業務 (LOB) システム内の関連するエンティティにリンクしています。たとえば、顧客が販売注文を行うため、顧客は AdventureWorks システムの販売注文に関連付けられています。顧客と販売注文との間には一対多のリレーションシップが存在します。関連付けは、親および子エンティティへのポインタを維持すると共に、ビジネス ロジックへのポインタを保持し、クライアントが親エンティティから子エンティティを取得できるようにします。関連付けのトラバーサルは、LOB システム上の単なるメソッド呼び出しです。関連付けにより、マスタ/詳細アプリケーションを簡単に作成できます。ビジネス データ カタログでの関連付けの詳細については、「関連付け」を参照してください。

ここでは、AdventureWorks2000 データベースで顧客と販売注文との関連付けを定義する方法を示します。特定の顧客の販売注文を見つけることは、一般的なビジネス ニーズです。ビジネス データ カタログでこの関連付けを定義すると、与えられた顧客 ID から販売注文を見つけることができます。関連付けの定義は、2 つの手順で構成されるプロセスです。まず、顧客 ID が与えられると販売注文を返すメソッドを、Customer エンティティで定義します。次に、Customer エンティティで定義したメソッドを指定して、2 つのエンティティ Customer と SalesOrder の間の関連付けを定義します。

注意

これは、参照元エンティティが 1 つ、参照先エンティティが 1 つの簡単な例です。参照元エンティティが複数あり、参照先エンティティが 1 つだけの場合は、参照先エンティティで関連付けロジックを定義することになると考えられます。ただし、ビジネス データ カタログを使用すると、同じ LobSystem インスタンス内の任意のエンティティに関連付けロジックを定義できます。

前提条件

手順 2 : エンティティ、メソッド、およびフィルタの定義」および必要に応じて「手順 3 (省略可能): アクションの定義

関連付けを定義するには

  1. 手順 2 または手順 3 で使用した AdventureWorks2000.xml ファイルを開きます。

  2. Product エンティティを定義した後で、<Entities> タグ内に次の XML を追加します。 この XML は、SalesOrder および Customer エンティティを定義します。Customer エンティティにも、顧客 ID を与えられると販売注文を返す GetSalesOrdersForCustomer() というメソッドの定義が含まれています。これが関連付けメソッドです。

    <Entity EstimatedInstanceCount="10000" Name="SalesOrder">
          <LocalizedDisplayNames>
            <LocalizedDisplayName LCID="1033">Sales Order</LocalizedDisplayName>
          </LocalizedDisplayNames>
          <Identifiers>
            <Identifier Name="SalesOrderID" TypeName="System.Int32" />
          </Identifiers>
          <Methods>
            <Method Name="GetSalesOrders">
              <Properties>
                <Property Name="RdbCommandText" Type="System.String">
                  SELECT SalesOrderID, OrderDate, SubTotal, IndividualID
                  FROM SalesOrderHeader, Individual WHERE (SalesOrderID &gt;= @MinSalesOrderID)
                  AND (SalesOrderID &lt;= @MaxSalesOrderID) AND (SalesOrderNumber LIKE @SalesOrderNumber)
                  AND SalesOrderHeader.CustomerID = Individual.CustomerID
                </Property>
                <Property Name="RdbCommandType" Type="System.String">Text</Property>
              </Properties>
              <FilterDescriptors>
                <FilterDescriptor Type="Comparison" Name="ID" >
                  <Properties>
                    <Property Name="Comparator" Type="System.String">Equals</Property>
                  </Properties>
                </FilterDescriptor>
                <FilterDescriptor Type="Wildcard" Name="SalesOrderNumber" />
              </FilterDescriptors>
              <Parameters>
                <Parameter Direction="In"  Name="@MinSalesOrderID">
                  <TypeDescriptor TypeName="System.Int32" IdentifierName="SalesOrderID" 
                                  AssociatedFilter="ID" Name="MinSalesOrderID">
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="SalesOrderFinderInstance" Type="System.Int32">0</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Direction="In"  Name="@MaxSalesOrderID">
                  <TypeDescriptor TypeName="System.Int32" IdentifierName="SalesOrderID" AssociatedFilter="ID" Name="MaxSalesOrderID">
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="SalesOrderFinderInstance" Type="System.Int32">99999999</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Direction="In"  Name="@SalesOrderNumber">
                  <TypeDescriptor TypeName="System.String" AssociatedFilter="SalesOrderNumber" Name="SalesOrderNumber">
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="SalesOrderFinderInstance" Type="System.String">%</DefaultValue>
                      <DefaultValue MethodInstanceName="SalesOrderSpecificFinderInstance" Type="System.String">%</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Direction="Return"  Name="SalesOrders">
                  <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="SalesOrderDataReader">
                    <TypeDescriptors>
                      <TypeDescriptor TypeName="System.Data.IDataRecord, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="SalesOrderDataRecord">
                        <TypeDescriptors>
                          <TypeDescriptor TypeName="System.Int32" IdentifierName="SalesOrderID" Name="SalesOrderID">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">ID</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.DateTime" Name="OrderDate">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">Order Date</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.Int32" Name="IndividualID">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">IndividualID</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.Decimal" Name="SubTotal">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">SubTotal</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Name="SalesOrderFinderInstance" Type="Finder" ReturnParameterName="SalesOrders" />
                <MethodInstance Name="SalesOrderSpecificFinderInstance" Type="SpecificFinder" ReturnParameterName="SalesOrders" />
              </MethodInstances>
            </Method>
          </Methods>
        </Entity>
        <Entity EstimatedInstanceCount="10000" Name="Customer">
          <Properties>
            <Property Name="Title" Type="System.String">FirstName</Property>
          </Properties>
          <Identifiers>
            <Identifier Name="IndividualID" TypeName="System.Int32" />
          </Identifiers>
          <Methods>
            <Method Name="GetCustomers">
              <Properties>
                <Property Name="RdbCommandText" Type="System.String">SELECT * FROM Individual WHERE (IndividualID &gt;= @MinIndividualID) AND (IndividualID &lt;= @MaxIndividualID) AND ((FirstName+' '+LastName) LIKE @Name)</Property>
                <Property Name="RdbCommandType" Type="System.String">Text</Property>
              </Properties>
              <FilterDescriptors>
                <FilterDescriptor Type="Comparison" Name="ID" >
                  <Properties>
                    <Property Name="Comparator" Type="System.String">Equals</Property>
                  </Properties>
                </FilterDescriptor>
                <FilterDescriptor Type="Wildcard" Name="Name" />
              </FilterDescriptors>
              <Parameters>
                <Parameter Direction="In"  Name="@MinIndividualID">
                  <TypeDescriptor TypeName="System.Int32" IdentifierName="IndividualID" AssociatedFilter="ID" Name="MinIndividualID">
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="CustomerFinderInstance" Type="System.Int32">0</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Direction="In"  Name="@MaxIndividualID">
                  <TypeDescriptor TypeName="System.Int32" IdentifierName="IndividualID" AssociatedFilter="ID" Name="MaxIndividualID">
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="CustomerFinderInstance" Type="System.Int32">99999999</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Direction="In"  Name="@Name">
                  <TypeDescriptor TypeName="System.String" AssociatedFilter="Name" Name="Name">
                    <DefaultValues>
                      <DefaultValue MethodInstanceName="CustomerFinderInstance" Type="System.String">%</DefaultValue>
                      <DefaultValue MethodInstanceName="CustomerSpecificFinderInstance" Type="System.String">%</DefaultValue>
                    </DefaultValues>
                  </TypeDescriptor>
                </Parameter>
                <Parameter Direction="Return"  Name="Customers">
                  <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="CustomerDataReader">
                    <TypeDescriptors>
                      <TypeDescriptor TypeName="System.Data.IDataRecord, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="CustomerDataRecord">
                        <TypeDescriptors>
                          <TypeDescriptor TypeName="System.Int32" IdentifierName="IndividualID" Name="IndividualID">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">ID</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.String" Name="FirstName">
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.String" Name="LastName">
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Name="CustomerFinderInstance" Type="Finder" ReturnParameterName="Customers" />
                <MethodInstance Name="CustomerSpecificFinderInstance" Type="SpecificFinder" ReturnParameterName="Customers" />
              </MethodInstances>
            </Method>
            <Method Name="GetSalesOrdersForCustomer">
              <Properties>
                <Property Name="RdbCommandText" Type="System.String">SELECT SalesOrderID, OrderDate, SubTotal,Individual.IndividualID FROM SalesOrderHeader,Individual WHERE SalesOrderHeader.CustomerID=Individual.CustomerID and Individual.IndividualID=@IndividualID</Property>
                <Property Name="RdbCommandType" Type="System.String">Text</Property>
              </Properties>
              <Parameters>
                <Parameter Direction="In"  Name="@IndividualID">
                  <TypeDescriptor TypeName="System.Int32" IdentifierName="IndividualID" Name="IndividualID" />
                </Parameter>
                <Parameter Direction="Return"  Name="SalesOrders">
                  <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="SalesOrderDataReader">
                    <TypeDescriptors>
                      <TypeDescriptor TypeName="System.Data.IDataRecord, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="SalesOrderDataRecord">
                        <TypeDescriptors>
                          <TypeDescriptor TypeName="System.Int32" IdentifierEntityName="SalesOrder" IdentifierName="SalesOrderID" Name="SalesOrderID">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">ID</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.DateTime" Name="OrderDate">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">Order Date</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.Int32" Name="IndividualID">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">IndividualID</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                          <TypeDescriptor TypeName="System.Decimal" Name="SubTotal">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">SubTotal</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                            <Properties>
                              <Property Name="DisplayByDefault" Type="System.Boolean">true</Property>
                            </Properties>
                          </TypeDescriptor>
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
            </Method>
          </Methods>
          <Actions>
            <Action Name="Send Email" Position="1" IsOpenedInNewWindow="true" Url="mailto:{0}.msn.com" ImageUrl="">
              <ActionParameters>
                <ActionParameter Name="FirstName" Index="0" />
              </ActionParameters>
            </Action>
          </Actions>
        </Entity>
    
  3. <Entities> タグの後に、次の XML を追加して、Customer エンティティと SalesOrder エンティティとの関連付けを定義します。

      <Associations>
        <Association AssociationMethodEntityName="Customer" AssociationMethodName="GetSalesOrdersForCustomer" AssociationMethodReturnParameterName="SalesOrders" Name="CustomerToSalesOrder" IsCached="true">
          <!-- Associations are just subclasses of MethodInstances. 
          They can also take ReturnTypeDescriptorName optionally. For 
          details, see SampleWebServiceMetadata.-->
          <SourceEntity Name="Customer" />
          <DestinationEntity Name="SalesOrder" />
          <!-- The source and destination entities can be the same. 
          For more information, see the SampleWebService example.-->
        </Association>
      </Associations>
    
  4. XML ファイルを保存します。

  5. アプリケーション定義を再び追加する前に、手順 1. で作成した AdventureWorksSample アプリケーションをビジネス データ カタログから削除する必要があります。AdventureWorksSample を削除するには、次の手順に従います。

    1. SharePoint 3.0 Central Administration を開きます。

    2. 左側のナビゲーション ウィンドウで、共有サービス プロバイダ (SSP) の名前をクリックします。.

    3. [Business Data Catalog ] セクションで、[View Applications] をクリックして、登録されているアプリケーションを表示します。

    4. [AdventureWorksSample] をクリックして、[アプリケーションの表示 : AdventureWorksSample] ページを開きます。

    5. 最後に、[ Application Settings] セクションの [Delete Application] をクリックします。

  6. ここで、ビジネス データ カタログにアプリケーション定義を追加します。詳細については、「[方法] アプリケーション定義をビジネス データ カタログに追加する」を参照してください。

  7. ビジネス データ リストと関連付け Web パーツを作成して、メタデータをテストします。詳細については、「[方法] ビジネス データの関連付けをテストする」を参照してください。

Next Steps

手順 5 (省略可能): IDEnumerator メソッドを定義してビジネス データの検索を有効にする

See Also

タスク

AdventureWorks SQL Server 2000 のサンプル

概念

ビジネス データ カタログ : メタデータ モデル