エンティティ間の関連付けの作成
関連付けを作成することで、ビジネス データ接続 (BDC) モデルのエンティティ間の関連性を定義できます。 Visual Studio では、モデルの使用者に各関連付けに関する情報を提供するメソッドが生成されます。 このようなメソッドは、SharePoint Web パーツ、またはカスタム アプリケーションから使用し、ユーザー インターフェイス (UI) のデータの関係性を表示できます。
関連付けの作成
関連付けを作成するには、Visual Studio ツールボックスの [関連付け] を選択し、最初のエンティティ (ソース エンティティと呼ばれます) をクリックし、2 番目のエンティティ (ターゲット エンティティと呼ばれます) をクリックします。 関連付けエディターで関連付けの詳細を定義できます。 詳細については、「方法: エンティティ間に関連付けを作成する」を参照してください。
関連付けのメソッド
SharePoint ビジネス データ Web パーツなどのアプリケーションは、エンティティのサービス クラスでメソッドを呼び出して関連付けを使用します。 関連付けエディターでメソッドを選択して、エンティティのサービス クラスにメソッドを追加できます。
既定では、関連付けエディターによって、ソース エンティティとターゲット エンティティに Association Navigation メソッドが追加されます。 ソース エンティティに Association Navigation メソッドを使用すると、ターゲット エンティティの一覧を取得できます。 ターゲット エンティティに Association Navigation メソッドを使用すると、ターゲット エンティティに関連するソース エンティティを取得できます。
適切な情報を返すには、これらの各メソッドにコードを追加する必要があります。 また、他の種類のメソッドを追加して、より高度なシナリオをサポートすることもできます。 これらの各メソッドの詳細については、サポート対象の操作に関する Web ページを参照してください。
関連付けの種類
BDC デザイナーでは、外部キーに基づく関連付けと外部キーなしの関連付けという 2 種類の関連付けを作成できます。
外部キーに基づく関連付け
ソース エンティティの識別子と、ターゲット エンティティに定義されている型記述子を関連付けることで、外部キーに基づく関連付けを作成できます。 モデルにこの関係を使用すると、ユーザーの UI を強化できます。 たとえば、ドロップダウン リストに顧客を表示できる販売注文を作成する Outlook のフォームや、顧客のプロファイル ページを開く SharePoint の販売注文の一覧などです。
外部キーに基づく関連付けを作成するには、同じ名前と型を共有する識別子と型記述子を関連付けます。 たとえば、Contact エンティティと SalesOrder エンティティの間に外部キーに基づく関連付けを作成するとします。 SalesOrder エンティティは、Finder メソッドまたは SpecificFinder メソッドの戻り値パラメーターの一部として ContactID 型記述子を返します。 関連付けエディターに両方の型記述子が表示されます。 Contact エンティティと SalesOrder エンティティの間に外部キーに基づく関連付けを作成するには、各フィールドの横にある ContactID 識別子を選択します。
ソース エンティティの Association Navigator メソッドに、ターゲット エンティティのコレクションを返すコードを追加します。 次の例では、ある連絡先の販売注文を返します。
Public Shared Function ContactToSalesOrder(ByVal contactID As Integer) As IEnumerable(Of SalesOrderHeader)
Const ServerName As String = "MySQLServerName"
Dim dataContext As AdventureWorksDataContext = _
New AdventureWorksDataContext("Data Source=" & ServerName & _
";Initial Catalog=AdventureWorks;Integrated Security=True")
Dim orderList As IEnumerable(Of SalesOrderHeader) = _
From orders In dataContext.SalesOrderHeaders _
Where orders.ContactID = contactID _
Select orders
Return orderList
End Function
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;
}
ターゲット エンティティの Association Navigator メソッドに、ソース エンティティを返すコードを追加します。 次の例では、販売注文に関連付けられた連絡先を返します。
Public Shared Function SalesOrderToContact(ByVal salesOrderID As Integer) As IEnumerable(Of Contact)
Const ServerName As String = "MySQLServerName"
Dim dataContext As AdventureWorksDataContext = _
New AdventureWorksDataContext("Data Source=" & ServerName & _
";Initial Catalog=AdventureWorks;Integrated Security=True")
Dim TempContactID As Integer = _
(From orders In dataContext.SalesOrderHeaders _
Where orders.SalesOrderID = salesOrderID _
Select orders.ContactID).[Single]()
Dim contactList As IEnumerable(Of Contact) = _
From contacts In dataContext.Contacts _
Where contacts.ContactID = TempContactID _
Select contacts
Return contactList
End Function
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 エンティティの Association Navigation メソッドの場合、テーブルを結合するか、ストアド プロシージャを呼び出して SalesOrderDetail エンティティを返します。
次の例では、テーブルを結合して、すべての販売注文の詳細を返します。
Public Shared Function ContactToSalesOrderDetail(ByVal contactID As Integer) As IEnumerable(Of SalesOrderDetail)
Const ServerName As String = "MySQLServerName"
Dim dataContext As AdventureWorksDataContext = _
New AdventureWorksDataContext("Data Source=" & ServerName & _
";Initial Catalog=AdventureWorks;Integrated Security=True")
Dim orderList As IEnumerable(Of SalesOrderDetail) = _
From orders In dataContext.SalesOrderHeaders _
Join orderDetails In dataContext.SalesOrderDetails On _
orders.SalesOrderID Equals orderDetails.SalesOrderID _
Where orders.ContactID = contactID _
Select orderDetails
Return orderList
End Function
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 エンティティの Association Navigation メソッドの場合、関連する Contact を返します。 次に例を示します。
Public Shared Function SalesOrderDetailToContact(ByVal salesOrderID As Integer, ByVal salesOrderDetailID As Integer) As IEnumerable(Of Contact)
Const ServerName As String = "MySQLServerName"
Dim dataContext As AdventureWorksDataContext = _
New AdventureWorksDataContext("Data Source=" & ServerName & _
";Initial Catalog=AdventureWorks;Integrated Security=True")
Dim TempContactID As Integer = _
(From orders In dataContext.SalesOrderHeaders _
Where orders.SalesOrderID = salesOrderID _
Select orders.ContactID).[Single]()
Dim contactList As IEnumerable(Of Contact) = _
From contacts In dataContext.Contacts _
Where contacts.ContactID = TempContactID _
Select contacts
Return contactList
End Function
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;
}