Associations entre entités
Vous pouvez définir des relations entre des entités dans votre modèle BDC (Business Data Connectivity) en créant des associations. Visual Studio génère des méthodes qui fournissent aux consommateurs du modèle des informations sur chaque association. Ces méthodes peuvent être utilisées par des parties WebPart, des listes ou des applications personnalisées SharePoint pour afficher les relations de données dans une interface utilisateur (IU).
Créez une association en choisissant le contrôle Association dans Visual Studio Boîte à outils, en choisissant la première entité (appelée entité source), puis en choisissant la deuxième entité (appelée entité de destination). Vous pouvez définir les détails de l’association dans l’Éditeur d’association. Pour plus d’informations, consultez Guide pratique pour créer une association entre des entités.
Les applications telles que les parties WebPart de données métier SharePoint consomment des associations en appelant des méthodes dans la classe de service d’une entité. Vous pouvez ajouter des méthodes à la classe de service d’une entité en les sélectionnant dans l’Éditeur d’association.
Par défaut, l’Éditeur d’association ajoute une méthode de navigation d’association aux entités source et de destination. Une méthode de navigation d’association dans l’entité source permet aux contrôles serveur consommateur de récupérer une liste d’entités de destination. Une méthode de navigation d’association dans l’entité de destination permet aux contrôles serveur consommateur de récupérer l’entité source liée à une entité de destination.
Vous devez ajouter le code à chacune de ces méthodes pour retourner les informations appropriées. Vous pouvez également ajouter d’autres types de méthodes pour prendre en charge des scénarios plus avancés. Pour plus d’informations sur chacune de ces méthodes, consultez Opérations prises en charge.
Vous pouvez créer deux types d’associations dans le concepteur BDC : les associations basées sur des clés étrangères et les associations sans clé étrangères.
Vous pouvez créer une association basée sur une clé étrangère en liant un identificateur dans l’entité source à des descripteurs de type définis dans l’entité de destination. Cette relation permet aux contrôles serveur consommateur du modèle de fournir une IU améliorée à leurs utilisateurs. Par exemple, un formulaire dans Outlook qui permet à un utilisateur de créer une commande client qui peut afficher les clients dans une liste déroulante ; ou une liste de commandes client dans SharePoint qui permet aux utilisateurs d’ouvrir une page de profil pour un client.
Pour créer une association basée sur une clé étrangère, associez les identificateurs et les descripteurs de type qui partagent le même nom et le même type. Par exemple, vous pouvez créer une association basée sur une clé étrangère entre une entité Contact
et une entité SalesOrder
. L’entité SalesOrder
retourne un ContactID
descripteur de type dans le cadre du paramètre de retour des méthodes Finder ou Finder spécifique. Les deux descripteurs de type apparaissent dans l’Éditeur d’association. Pour créer une relation basée sur une clé étrangère entre l’entité Contact
et l’entitéSalesOrder
, choisissez l’identificateur ContactID
en regard de chacun de ces champs.
Ajoutez du code à la méthode Navigateur d’association de l’entité source qui retourne une collection d’entités de destination. L’exemple suivant retourne les commandes client pour un contact.
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;
}
Ajoutez du code à la méthode Navigateur d’association de l’entité de destination qui retourne une entité source. L’exemple suivant retourne le contact lié à la commande client.
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;
}
Vous pouvez créer une association sans mapper des identificateurs aux descripteurs de type de champ. Créez ce type d’association lorsque l’entité source n’a pas de relation directe avec l’entité de destination. Par exemple, une table SalesOrderDetail
n’a pas de clé étrangère mappée à une clé primaire dans une table Contact
.
Si vous souhaitez afficher dans la table SalesOrderDetail
des informations relatives à un Contact
, vous pouvez créer une association sans clé étrangère entre l’entité Contact
et l’entité SalesOrderDetail
.
Dans la méthode Navigation d’association de l’entité Contact
, retournez les entités SalesOrderDetail
en joignant des tables ou en appelant une procédure stockée.
L’exemple suivant retourne les détails de toutes les commandes client en joignant des tables.
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;
}
Dans la méthode Navigation d’association de l’entité SalesOrderDetail
, retournez le Contact
associé. l’exemple ci-dessous illustre ce cas de figure.
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;
}