エンティティ間の関連付け

関連付けを作成することによって、ビジネス データ接続 (BDC) モデルのエンティティ間のリレーションシップを定義できます。 Visual Studio では、モデルのコンシューマーに各関連付けに関する情報を提供するメソッドが生成されます。 これらのメソッドは、SharePoint Web パーツ、リスト、またはカスタム アプリケーションで、ユーザー インターフェイス (UI) にデータ リレーションシップを表示するために使用できます。

関連付けを作成する

関連付けを作成するには、Visual Studio の [ツールボックス][関連付け] コントロールを選択し、1 つ目のエンティティ (ソース エンティティと呼ばれます) を選択した後、2 つ目のエンティティ (ターゲット エンティティと呼ばれます) を選択します。 関連付けの詳細は、関連付けエディターで定義できます。 詳しくは、「方法: エンティティ間に関連付けを作成する」をご覧ください。

関連付けメソッド

SharePoint ビジネス データ Web パーツなどのアプリケーションは、エンティティのサービス クラスでメソッドを呼び出すことによって、関連付けを使用します。 エンティティのサービス クラスにメソッドを追加するには、関連付けエディターでそれらを選択します。

既定では、関連付けエディターによって、ソース エンティティとターゲット エンティティに関連付けナビゲーション メソッドが追加されます。 ソース エンティティの関連付けナビゲーション メソッドを使用すると、コンシューマーはターゲット エンティティの一覧を取得できます。 ターゲット エンティティの関連付けナビゲーション メソッドを使用すると、コンシューマーは、ターゲット エンティティに関連付けられているソース エンティティを取得できます。

適切な情報を返すには、これらの各メソッドにコードを追加する必要があります。 さらに高度なシナリオをサポートするために、他の種類のメソッドを追加することもできます。 これらの各方法について詳しくは、サポートされる操作に関する記事をご覧ください。

関連付けの種類

BDC デザイナーでは、2 種類の関連付けを作成できます。外部キー ベースの関連付けと、外部キーなしの関連付けです。

外部キー ベースの関連付け

外部キー ベースの関連付けを作成するには、ソース エンティティの識別子を、ターゲット エンティティで定義されている型記述子に関連付けます。 このリレーションシップを使用することで、モデルのコンシューマーは、ユーザーに対して高度な UI を提供できます。 たとえば、Outlook のフォームでユーザーが販売注文を作成し、ドロップダウン リストに顧客を表示できるようにしたり、SharePoint の販売注文一覧でユーザーが顧客のプロファイル ページを開けるようにしたりすることができます。

外部キー ベースの関連付けを作成するには、同じ名前と型を共有する、識別子と型記述子を関連付けます。 たとえば、Contact エンティティと SalesOrder エンティティの間に外部キー ベースの関連付けを作成できます。 SalesOrder エンティティは、Finder または Specific Finder メソッドの戻りパラメーターの一部として、ContactID 型記述子を返します。 関連付けエディターには、両方の型記述子が表示されます。 Contact エンティティと SalesOrder エンティティの間に外部キー ベースのリレーションシップを作成するには、これらの各フィールドの横にある ContactID 識別子を選択します。

ソース エンティティの関連付けナビゲーター メソッドには、ターゲット エンティティのコレクションを返すコードを追加します。 次の例では、連絡先の販売注文が返されます。

public static IEnumerable<SalesOrderHeader> ContactToSalesOrder(int contactID)
{
    const string ServerName = "MySQLServerName";
    AdventureWorksDataContext dataContext = new AdventureWorksDataContext
          ("Data Source=" + ServerName + ";" +
           "Initial Catalog=AdventureWorks;Integrated Security=True");

    IEnumerable<SalesOrderHeader> orderList = 
        from orders in dataContext.SalesOrderHeaders
             where orders.ContactID == contactID
             select orders;
    return orderList;
}

ターゲット エンティティの関連付けナビゲーター メソッドには、ソース エンティティを返すコードを追加します。 次の例では、販売注文に関連付けられている連絡先が返されます。

public static IEnumerable<Contact> SalesOrderToContact(int salesOrderID)
{
    const string ServerName = "MySQLServerName";
    AdventureWorksDataContext dataContext = new AdventureWorksDataContext
          ("Data Source=" + ServerName + ";" +
           "Initial Catalog=AdventureWorks;Integrated Security=True");

    int TempContactID = (from orders in dataContext.SalesOrderHeaders
                     where orders.SalesOrderID == salesOrderID
                     select orders.ContactID).Single();

    IEnumerable<Contact> contactList = from contacts in dataContext.Contacts
                                     where contacts.ContactID == TempContactID
                                     select contacts;
    return contactList;

}

外部キーなしの関連付け

関連付けは、識別子をフィールド型記述子にマップせずに作成することもできます。 ソース エンティティにターゲット エンティティとの直接的なリレーションシップがない場合は、この種類の関連付けを作成します。 たとえば、SalesOrderDetail テーブルには、Contact テーブル内の主キーにマップされる外部キーがありません。

Contact に関連する情報を SalesOrderDetail テーブルに表示したい場合は、Contact エンティティと SalesOrderDetail エンティティの間に外部キーなし関連付けを作成します。

Contact エンティティの関連付けナビゲーション メソッドでは、テーブルを結合するか、ストアド プロシージャを呼び出すことで、SalesOrderDetail エンティティを返します。

次の例では、テーブルを結合することで、すべての販売注文の詳細が返されます。

public static IEnumerable<SalesOrderDetail> ContactToSalesOrderDetail(int contactID)
{
    const string ServerName = "MySQLServerName";
    AdventureWorksDataContext dataContext = new AdventureWorksDataContext
          ("Data Source=" + ServerName + ";" +
           "Initial Catalog=AdventureWorks;Integrated Security=True");

    IEnumerable<SalesOrderDetail> orderList =
        from orders in dataContext.SalesOrderHeaders
        join orderDetails in dataContext.SalesOrderDetails on
            orders.SalesOrderID equals orderDetails.SalesOrderID
        where orders.ContactID == contactID
        select orderDetails;
    return orderList;
}

SalesOrderDetail エンティティの関連付けナビゲーション メソッドでは、関連する Contact を返します。 次に例を示します。

public static IEnumerable<Contact> SalesOrderDetailToContact(int salesOrderID, int salesOrderDetailID)
{
    const string ServerName = "MySQLServerName";
    AdventureWorksDataContext dataContext = new AdventureWorksDataContext
          ("Data Source=" + ServerName + ";" +
           "Initial Catalog=AdventureWorks;Integrated Security=True");
        
    int TempContactID = (from orders in dataContext.SalesOrderHeaders
                         where orders.SalesOrderID == salesOrderID
                         select orders.ContactID).Single();

    IEnumerable<Contact> contactList = from contacts in dataContext.Contacts
                                       where contacts.ContactID == TempContactID
                                       select contacts;
    return contactList;
}