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