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


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

Чтобы определить отношения между сущностями в модели BDC, можно создать ассоциации.Visual Studio создает методы, предоставляющие потребителям модели сведения о каждой ассоциации.Эти методы могут быть использованы интернет SharePoint разбивают, списки или пользовательских приложений для отображения отношений данных в пользовательском интерфейсе (ui).

Создание ассоциации

Создание ассоциации, выбрав элемент управления Ассоциация в Visual Studio Панель элементов, выбор первая сущность (сущностью источника), а затем выбрать вторую сущность (сущностью назначения).В Редакторе ассоциаций можно определять подробности ассоциации.Дополнительные сведения см. в разделе Практическое руководство. Создание ассоциации между сущностями.

Методы связи

Приложения, как веб-части бизнес-данных SharePoint используют ассоциации, вызывая методы в классе службы сущности.Чтобы добавить методы в класс службы сущности, нужно выбрать их в Редакторе ассоциаций.

По умолчанию Редактор ассоциаций добавляет метод навигации ассоциаций в исходную и конечную сущности.Метод навигации ассоциаций в исходной сущности позволяет потребителям извлекать список конечных сущностей.Метод навигации ассоциаций в конечной сущности позволяет потребителям извлекать исходную сущность, которая соотносится с конечной сущностью.

Чтобы возвратить необходимую информацию, необходимо добавить код в каждый из этих методов.Кроме того, можно добавить другие типы методов, чтобы обеспечить поддержку более сложных сценариев.Дополнительные сведения о каждом из этих методов см. в разделе Supported Operations.

Типы ассоциаций

В конструкторе BDC можно создать два типа ассоциаций: ассоциации на основе внешнего ключа и ассоциации без внешнего ключа.

Ee348596.collapse_all(ru-ru,VS.110).gifАссоциация на основе внешнего ключа

Чтобы создать ассоциацию на основе внешнего ключа, можно связать идентификатор в исходной сущности с дескрипторами типа, определенными в конечной сущности.Это отношение позволяет потребителям модели предоставлять своим пользователям интерфейс с расширенными возможностями.Например, форма в приложении Outlook, позволяющая пользователю создавать заказ, в котором клиенты отображаются в раскрывающемся списке; либо список заказов в SharePoint, позволяющий пользователям открывать страницу профиля клиента.

Чтобы создать ассоциацию на основе внешнего ключа, необходимо связать идентификаторы и дескрипторы типа, имеющие одни и те же имена и типы.Например, можно создать ассоциацию на основе внешнего ключа между сущностями Contact и SalesOrder.Сущность SalesOrder возвращает дескриптор типа ContactID как часть возвращаемого параметра метода поиска и конкретного метода поиска.Оба дескриптора типа отображаются в Редакторе ассоциаций.Для создания чужое ключ-, основанное Contact связь между сущностью и сущностью SalesOrder выберите идентификатор ContactID рядом с каждым из этих полей.

Добавьте код, возвращающий коллекцию конечных сущностей, в метод навигации ассоциаций исходной сущности.В следующем примере показано возвращение заказа для контакта.

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;
}

Добавьте код, возвращающий исходную сущность, в метод навигации ассоциаций конечной сущности.В следующем примере показано возвращение контакта, связанного с заказом.

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;

}

Ee348596.collapse_all(ru-ru,VS.110).gifАссоциация без внешнего ключа

Можно создать ассоциацию, не сопоставляя идентификаторы дескрипторам типа поля.Этот вид ассоциации создается, если исходная сущность не связана прямыми отношениями с конечной сущностью.Например, таблица SalesOrderDetail не имеет внешнего ключа, сопоставляемого первичному ключу в таблице Contact.

Если требуется отобразить сведения в таблице SalesOrderDetail, связанные с таблицей Contact, можно создать ассоциацию без внешнего ключа между сущностями Contact и SalesOrderDetail.

В методе навигации ассоциаций сущности Contact необходимо возвратить сущности 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 необходимо возвратить связанную сущность 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;
}

См. также

Задачи

Практическое руководство. Создание ассоциации между сущностями

Другие ресурсы

Проектирование модели подключения к бизнес-данным