연결을 만들어 BDC(Business Data Connectivity) 모델에서 엔터티 간의 관계를 정의할 수 있습니다. Visual Studio는 모델의 소비자에게 각 연결에 대한 정보를 제공하는 메서드를 생성합니다. 이러한 메서드는 SharePoint 웹 파트, 목록 또는 사용자 지정 애플리케이션에서 UI(사용자 인터페이스)에 데이터 관계를 표시하는 데 사용할 수 있습니다.
연관성 만들기
Visual Studio 도구 상자에서 연결 컨트롤을 선택하고 첫 번째 엔터티(원본 엔터티라고 함)를 선택한 다음 두 번째 엔터티(대상 엔터티라고 함)를 선택하여 연결을 만듭니다. 연결 편집기에서 연결의 세부 정보를 정의할 수 있습니다. 자세한 내용은 방법: 엔터티 간 연결 만들기를 참조하세요.
연결 방법
SharePoint 비즈니스 데이터 웹 파트와 같은 애플리케이션은 엔터티의 서비스 클래스에서 메서드를 호출하여 연결을 사용합니다. 연결 편집기에서 선택하여 엔터티의 서비스 클래스에 메서드를 추가할 수 있습니다.
기본적으로 연결 편집기 에서는 원본 및 대상 엔터티에 연결 탐색 메서드를 추가합니다. 원본 엔터티의 연결 탐색 메서드를 사용하면 소비자가 대상 엔터티 목록을 검색할 수 있습니다. 대상 엔터티의 연결 탐색 메서드를 사용하면 소비자가 대상 엔터티와 관련된 원본 엔터티를 검색할 수 있습니다.
적절한 정보를 반환하려면 이러한 각 메서드에 코드를 추가해야 합니다. 고급 시나리오를 지원하기 위해 다른 유형의 메서드를 추가할 수도 있습니다. 이러한 각 메서드에 대한 자세한 내용은 지원되는 작업을 참조하세요.
협회 유형
BDC 디자이너에서 외래 키 기반 연결 및 외래 키 없는 연결의 두 가지 유형의 연결을 만들 수 있습니다.
외래 키 기반 연결
원본 엔터티의 식별자를 대상 엔터티에 정의된 형식 설명자와 연결하여 외래 키 기반 연결을 만들 수 있습니다. 이 관계를 통해 모델의 소비자는 사용자에게 향상된 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;
}