Condividi tramite


Creazione di un'associazione tra entità

È possibile definire relazioni tra entità nel modello di integrazione applicativa dei dati mediante la creazione di associazioni. In Visual Studio vengono generati metodi che forniscono informazioni su ogni associazione agli utenti del modello. Questi metodi possono essere utilizzati da web part di SharePoint, elenchi o applicazioni personalizzate per visualizzare relazioni dei dati in un'interfaccia utente.

Creazione di un'associazione

Per creare un'associazione, selezionare una Associazione nella Casella degli strumenti di Visual Studio, fare clic sulla prima entità (detta entità di origine), quindi fare clic sulla seconda entità (detta entità di destinazione). È possibile definire i dettagli dell'associazione nell'Editor di associazione. Per ulteriori informazioni, vedere Procedura: creare un'associazione tra entità.

Metodi di associazione

Applicazioni come le web part di integrazione applicativa dei dati di SharePoint utilizzano associazioni mediante la chiamata ai metodi nella classe di servizio di un'entità. È possibile aggiungere metodi alla classe di servizio di un'entità selezionandoli nell'Editor di associazione.

Per impostazione predefinita, l'Editor di associazione aggiunge un metodo di tipo AssociationNavigator alle entità di origine e di destinazione. Un metodo di tipo AssociationNavigator nell'entità di origine consente agli utenti di recuperare un elenco di entità di destinazione. Un metodo di tipo AssociationNavigator nell'entità di destinazione consente agli utenti di recuperare l'entità di origine correlata all'entità di destinazione.

È necessario aggiungere il codice a ognuno di questi metodi per restituire le informazioni corrette. È inoltre possibile aggiungere altri tipi di metodi per supportare scenari più avanzati. Per ulteriori informazioni su ciascuno di questi metodi, vedere l'articolo relativo alle operazioni supportate (la pagina potrebbe essere in inglese).

Tipi di associazioni

È possibile creare due tipi di associazioni nella finestra di progettazione dell'integrazione applicativa dei dati: associazioni basate su chiave esterna e associazioni senza chiave esterna.

Associazione basata su chiave esterna

È possibile creare un'associazione basata su chiave esterna creando una relazione tra un identificatore nell'entità di origine e i descrittori di tipo definiti nell'entità di destinazione. Questa relazione consente a coloro che utilizzano il modello di fornire un'interfaccia utente avanzata per gli utenti. Ad esempio, un form di Outlook che consente un utente di creare un ordine di vendita in cui vengono visualizzati i clienti in un elenco a discesa oppure un elenco di ordini di vendita in SharePoint che consente agli utenti di aprire una pagina del profilo di un cliente.

Per creare un'associazione basata su chiave esterna, è necessario mettere in relazione identificatori e descrittori di tipo che condividono lo stesso nome e lo stesso tipo. È possibile, ad esempio, creare un'associazione basata su chiave esterna tra un'entità Contact e un'entità SalesOrder. L'entità SalesOrder restituisce un descrittore di tipo ContactID come parte del parametro restituito dal metodo Finder o Finder specifico. Entrambi i descrittori di tipo vengono visualizzati nell'Editor di associazione. Per creare una relazione basata su chiave esterna tra l'entità Contact e l'entità SalesOrder, selezionare l'identificatore ContactID accanto a ognuno di questi campi.

Aggiungere codice al metodo di tipo AssociationNavigator dell'entità di origine in modo che restituisca un insieme di entità di destinazione. Nell'esempio seguente vengono restituiti gli ordini di vendita per un contatto.

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

Aggiungere codice al metodo di tipo AssociationNavigator dell'entità di destinazione in modo che restituisca un'entità di origine. Nell'esempio seguente viene restituito il contatto correlato all'ordine di vendita.

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;

}

Associazione senza chiave esterna

È possibile creare un'associazione senza eseguire il mapping di identificatori ai descrittori di tipo di campo. Creare questo tipo di associazione quando l'entità di origine non dispone di una relazione diretta con l'entità di destinazione. Ad esempio, una tabella SalesOrderDetail non dispone di una chiave esterna di cui viene eseguito il mapping a una chiave primaria in una tabella Contact.

Se si desidera visualizzare informazioni nella tabella SalesOrderDetail correlate a una tabella Contact, è possibile creare un'associazione senza chiave esterna tra l'entità Contact e l'entità SalesOrderDetail.

Nel metodo di tipo AssociationNavigator dell'entità Contact è possibile restituire le entità SalesOrderDetail unendo le tabelle o chiamando una stored procedure.

Nell'esempio seguente vengono restituiti dettagli di tutti gli ordini di vendita mediante l'unione delle tabelle.

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

Nel metodo di tipo AssociationNavigator dell'entità SalesOrderDetail restituire l'entità Contact correlata. Questo concetto è illustrato nell'esempio seguente.

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

Vedere anche

Altre risorse

Progettazione di un modello di integrazione applicativa dei dati

Procedura: creare un'associazione tra entità