Asociaciones entre entidades

Puede definir relaciones entre entidades en el modelo de Conectividad a datos profesionales (BDC) mediante la creación de asociaciones. Visual Studio genera métodos que proporcionan a los consumidores del modelo información sobre cada asociación. Estos métodos se pueden consumir en elementos web, listas o aplicaciones personalizadas de SharePoint para mostrar relaciones de datos en una interfaz de usuario (UI).

Creación de una asociación

Cree una asociación; para ello, elija el control Asociación en el Cuadro de herramientas de Visual Studio, elija la primera entidad (denominada entidad de origen) y, luego, elija la segunda entidad (denominada entidad de destino). Puede definir los detalles de la asociación en el Editor de asociaciones. Para más información, consulte Creación de asociaciones entre tipos.

Métodos de asociación

Las aplicaciones, como los elementos web de datos empresariales de SharePoint, consumen asociaciones mediante la llamada 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 de asociación a las entidades de origen y destino. Un método de navegación de asociación en la entidad de origen permite a los consumidores recuperar una lista de entidades de destino. Un método de navegación de asociación en la entidad de destino permite a los consumidores recuperar la entidad de origen relacionada con una entidad de destino.

Debe agregar el código a cada uno de estos métodos para devolver la información adecuada. También puede agregar otros tipos de métodos para admitir escenarios más avanzados. Para más información sobre cada uno de estos métodos, consulte Operaciones admitidas.

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 si relaciona un identificador de la entidad de origen con descriptores de tipo definidos en la entidad de destino. Esta relación permite a los consumidores del modelo proporcionar una interfaz de usuario mejorada para sus usuarios. Por ejemplo, un formulario de Outlook que permita a un usuario crear un pedido de ventas que pueda mostrar a los clientes en una lista desplegable; o una lista de pedidos de ventas en SharePoint que permita a los usuarios abrir una página de perfil para un cliente.

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

Agregue código al método Association Navigator de la entidad de origen que devuelve una colección de entidades de destino. En el ejemplo siguiente se devuelven los pedidos de ventas de un contacto.

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

Agregue código al método Association Navigator de la entidad de destino que devuelve una entidad de origen. En el ejemplo siguiente se devuelve el contacto relacionado con el pedido de venta.

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 descriptores de tipo de campo. Cree este tipo de asociación cuando la entidad de origen no tenga una relación directa con la entidad de destino. Por ejemplo, una tabla SalesOrderDetail no tiene una clave externa que se corresponda con una clave principal de una tabla Contact.

Si quiere mostrar información en la tabla SalesOrderDetail relacionada con Contact, puede crear una asociación sin clave externa entre la entidad y Contact la entidad SalesOrderDetail.

En el método Association Navigation de la entidad Contact, devuelva las entidades SalesOrderDetail mediante la combinación de tablas o la llamada a un procedimiento almacenado.

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

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 Association Navigation de la entidad SalesOrderDetail, devuelva el objeto Contact relacionado. En el siguiente ejemplo se muestra cómo hacerlo.

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