Compartir a través de


Crear una asociación entre entidades

Puede definir las relaciones entre las entidades del Modelo de conectividad a datos profesionales (BDC) creando asociaciones. Visual Studio genera métodos que proporcionan a los consumidores del modelo información sobre cada asociación. Los elementos web, las listas o las aplicaciones de SharePoint personalizados pueden utilizar estos métodos para mostrar las relaciones de datos en una interfaz de usuario (IU).

Crear una asociación

Cree una asociación seleccionando una Asociación en el Cuadro de herramientas de Visual Studio mientras hace clic en la primera entidad (denominada entidad de origen) y después en la segunda entidad (denominada entidad de destino). Puede definir los detalles de la asociación en el Editor de asociaciones. Para obtener más información, vea Cómo crear una asociación entre entidades.

Métodos de asociación

Las aplicaciones como los elementos web de datos profesionales de SharePoint utilizan las asociaciones llamando a métodos de la clase de servicio de una entidad. Puede agregar métodos a la clase de servicio de una entidad seleccionándolos en el Editor de asociaciones.

De forma predeterminada, el Editor de asociaciones agrega un método de navegación mediante asociaciones a las entidades de origen y destino. Un método de navegación mediante asociaciones en la entidad de origen permite a los consumidores recuperar una lista de las entidades de destino. Un método de navegación mediante asociaciones en la entidad de destino permite a los consumidores recuperar la entidad de origen que se relaciona con una entidad de destino.

Debe agregar código a cada uno de estos métodos para que devuelvan la información adecuada. También puede agregar otros tipos de métodos para escenarios más avanzados. Para obtener más información sobre cada uno de estos métodos, vea Supported Operations.

Tipos de asociaciones

Puede crear dos tipos de asociaciones en el diseñador de BDC: asociaciones basadas en clave externa y asociaciones sin clave externa.

Asociación basada en clave externa

Puede crear una asociación basada en clave externa relacionando un identificador de la entidad de origen con los descriptores de tipo definidos en la entidad de destino. Esta relación permite a los consumidores del modelo proporcionar una interfaz de usuario mejorada a sus usuarios. Por ejemplo, un formulario de Outlook que permite a un usuario crear un pedido de ventas que puede mostrar los clientes en una lista desplegable; o una lista de pedidos de ventas de SharePoint que permite a los usuarios abrir una página de perfiles para un cliente.

Para crear una asociación basada en clave externa, relacione los identificadores y descriptores de tipos que comparten el mismo nombre y tipo. Por ejemplo, podría crear una asociación basada en clave externa entre una entidad Contact y una entidad SalesOrder. La entidad SalesOrder devuelve un descriptor de tipos ContactID como parte del parámetro devuelto de los métodos Finder o Finder específico. Ambos descriptores de tipos aparecen en el Editor de asociaciones. Para crear una relación basada en clave externa entre la entidad Contact y la entidad SalesOrder, seleccione el identificador ContactID situado junto a cada uno de estos campo.

En el método de navegación mediante asociaciones de la entidad de origen, agregue código que devuelva una colección de entidades de destino. En el siguiente ejemplo se devuelven los pedidos de ventas de un contacto.

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

En el método de navegación mediante asociaciones de la entidad de destino, agregue código que devuelva la entidad de origen. En el siguiente ejemplo se devuelve el contacto que se relaciona con el pedido de ventas.

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;

}

Asociación sin clave externa

Puede crear una asociación sin asignar identificadores a los descriptores de tipos de campo. Cree este tipo de asociación cuando la entidad de origen no tenga relación directa con la entidad de destino. Por ejemplo, una tabla SalesOrderDetail no tiene ninguna clave externa asignada a una clave principal de una tabla Contact.

Si desea mostrar la información de la tabla SalesOrderDetail que está relacionada con un Contact, puede crear una asociación de clave externa entre la entidad Contact y la entidad SalesOrderDetail.

En el método de navegación mediante asociaciones de la entidad Contact, devuelva las entidades SalesOrderDetail uniendo las tablas o llamando a un procedimiento almacenado.

En el siguiente ejemplo se devuelven detalles de todos los pedidos de ventas mediante la unión de las tablas.

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

En el método de navegación mediante asociaciones de la entidad SalesOrderDetail, devuelva el Contact relacionado. En el siguiente ejemplo se muestra cómo hacerlo.

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

Vea también

Otros recursos

Diseñar un modelo de conectividad a datos profesionales

Cómo crear una asociación entre entidades