Création d'une association entre des entités

Vous pouvez définir des relations entre des entités dans votre modèle de connectivité de données métiers (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 consommées par des composants WebPart SharePoint, des listes ou des applications personnalisées pour afficher des relations de données dans une interface utilisateur.

Création d'une association

Pour créer une association, sélectionnez une Association dans la Boîte à outils de Visual Studio, cliquez sur la première entité (appelée « entité source »), puis cliquez sur la deuxième entité (appelée « entité de destination »). Vous pouvez définir les détails de l'association dans l'Éditeur d'associations. Pour plus d'informations, consultez Comment : créer une association entre des entités.

Méthodes d'association

Certaines applications, telles que les composants WebPart de données métiers 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'associations.

Par défaut, l'Éditeur d'associations ajoute une méthode de navigateur d'associations à l'entité source et à l'entité de destination. Dans l'entité source, une méthode de navigateur d'associations permet aux consommateurs de récupérer une liste d'entités de destination. Dans l'entité de destination, une méthode de navigateur d'associations permet aux consommateurs de récupérer l'entité source qui est associée à une entité de destination.

Vous devez ajouter du 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 un plus grand nombre de scénarios avancés. Pour plus d'informations sur chacune de ces méthodes, consultez Opérations prises en charge (page éventuellement en anglais).

Types d'associations

Vous pouvez créer deux types d'associations dans le concepteur BDC : des associations de clé étrangère ou des associations sans clé étrangère.

Association de clé étrangère

Vous pouvez créer une association de clé étrangère en mettant un identificateur de l'entité source en relation avec des descripteurs de type définis dans l'entité de destination. Cette relation permet aux consommateurs du modèle de fournir une interface utilisateur améliorée aux utilisateurs. En voici deux exemples : un formulaire dans Outlook qui permet à un utilisateur de créer une commande client pouvant afficher les clients dans une liste déroulante ; ou une liste de commandes client dans SharePoint qui permet aux utilisateurs d'ouvrir la page de profil d'un client.

Pour créer une association de clé étrangère, mettez en relation des identificateurs et des descripteurs de type qui partagent le même nom et le même type. Par exemple, vous pouvez créer une association de clé étrangère entre une entité Contact et une entité SalesOrder. L'entité SalesOrder retourne un descripteur de type ContactID dans le cadre du paramètre de retour des méthodes de recherche ou de recherche spécifique. Les deux descripteurs de type s'affichent dans l'Éditeur d'associations. Pour créer une relation de clé étrangère entre l'entité Contact et l'entité SalesOrder, sélectionnez l'identificateur ContactID en regard de chacun de ces champs.

Vous pouvez ajouter du code à la méthode du navigateur d'associations de l'entité source qui retourne une collection d'entités de destination. L'exemple suivant retourne les commandes client d'un contact.

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

Vous pouvez ajouter du code à la méthode du navigateur d'associations de l'entité de destination qui retourne une entité source. L'exemple suivant retourne le contact qui est associé à la commande client.

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;

}

Association sans clé étrangère

Vous pouvez créer une association sans mapper d'identificateurs à des descripteurs de type de champ. Vous pouvez créer ce type d'association lorsque l'entité source n'a pas de relation directe avec l'entité de destination. Tel est le cas lorsqu'une table SalesOrderDetail ne possède pas de clé étrangère qui soit mappée à une clé primaire dans une table Contact.

Si vous souhaitez afficher des informations dans la table SalesOrderDetail qui est associée à un Contact, vous pouvez créer une association sans clé étrangère entre l'entité Contact et l'entité SalesOrderDetail.

Dans la méthode du navigateur d'associations de l'entité Contact, vous pouvez retourner 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 suite à la jonction de tables.

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

Dans la méthode du navigateur d'associations de l'entité SalesOrderDetail, vous pouvez retourner le Contact associé, comme illustré dans l'exemple suivant.

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

Voir aussi

Autres ressources

Conception d'un modèle de connectivité de données métiers

Comment : créer une association entre des entités