Связи между сущностями
Вы можете определить связи между сущностями в модели бизнес-данных Подключение ivity (BDC), создав связи. Visual Studio создает методы, предоставляющие потребителям модели сведения о каждой ассоциации. Эти методы могут использоваться веб-частями SharePoint, списками или пользовательскими приложениями для отображения отношений данных в интерфейсе пользователя (ИП).
Создание ассоциации
Создайте связь, выбрав элемент управления Ассоциации на панели элементов Visual Studio, выбрав первую сущность (называемую исходной сущностью), а затем выбрав вторую сущность (называемую конечной сущностью). Сведения об ассоциации можно определить в редакторе ассоциаций. Дополнительные сведения см. в разделе "Практическое руководство. Создание связи между сущностями".
Методы ассоциации
Такие приложения, как веб-части бизнес-данных SharePoint, используют связи, вызывая методы в классе служб сущности. Методы можно добавить в класс службы сущности, выбрав их в редакторе ассоциаций.
По умолчанию редактор ассоциаций добавляет метод навигации ассоциации в исходные и целевые сущности. Метод навигации ассоциаций в исходной сущности позволяет потребителям получить список конечных сущностей. Метод навигации ассоциации в конечной сущности позволяет потребителям получить исходную сущность, связанную с конечной сущностью.
Чтобы вернуть соответствующую информацию, необходимо добавить код в каждый из этих методов. Можно также добавить другие типы методов для поддержки более сложных сценариев. Дополнительные сведения о каждом из этих методов см. в разделе "Поддерживаемые операции".
Типы связей
В конструкторе BDC можно создать два типа ассоциаций: связи на основе внешнего ключа и внешние связи без ключей.
Связь на основе внешнего ключа
Связь на основе внешнего ключа можно создать, связав идентификатор в исходной сущности с дескрипторами типов, определенными в конечной сущности. Эта связь позволяет потребителям модели предоставлять расширенный пользовательский интерфейс для своих пользователей. Например, форма в Outlook, которая позволяет пользователю создавать заказ на продажу, который может отображать клиентов в раскрывающемся списке; или список заказов на продажу в SharePoint, позволяющий пользователям открывать страницу профиля для клиента.
Чтобы создать связь на основе внешнего ключа, соотносите идентификаторы и дескрипторы типов с одинаковым именем и типом. Например, можно создать связь на основе внешнего ключа между Contact
сущностью и сущностью SalesOrder
. Сущность SalesOrder
возвращает ContactID
дескриптор типа в рамках возвращаемого параметра методов Finder или Specific Finder. Оба дескриптора типов отображаются в редакторе ассоциаций. Чтобы создать связь на основе внешнего ключа между Contact
сущностью и SalesOrder
сущностью, выберите ContactID
идентификатор рядом с каждым из этих полей.
Добавьте код в метод Association Navigator исходной сущности, возвращающей коллекцию конечных сущностей. В следующем примере возвращаются заказы на продажу для контакта.
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 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
в таблице.
Если вы хотите отобразить сведения в SalesOrderDetail
таблице, связанной с нейContact
, можно создать связь без внешнего ключа между сущностью и SalesOrderDetail
сущностьюContact
.
В методе навигации ассоциации 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;
}