Поделиться через


Связи между сущностями

Вы можете определить связи между сущностями в модели бизнес-данных Подключение 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;
}