エンティティ間の関連付け
関連付けを作成することによって、ビジネス データ接続 (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;
}