Compartilhar via


Associações entre entidades

Você pode definir relações entre entidades em seu modelo de Conectividade de Dados Corporativos (BDC, na sigla em inglês) criando associações. O Visual Studio gera métodos que fornecem aos consumidores do modelo informações sobre cada associação. Esses métodos podem ser consumidos por Web Parts, listas ou aplicativos personalizados do SharePoint para exibir relações de dados em uma interface do usuário.

Criar uma associação

Crie uma associação escolhendo o controle Associação na Caixa de Ferramentas do Visual Studio, escolhendo a primeira entidade (chamada de entidade de origem) e, por fim, escolhendo a segunda entidade (chamada de entidade de destino). É possível definir os detalhes da associação no Editor de Associação. Para obter mais informações, confira Como criar uma associação entre entidades.

Métodos de associação

Aplicativos como Web Parts de dados corporativos do SharePoint consomem associações ao chamar métodos na classe de serviço de uma entidade. É possível adicionar métodos à classe de serviço de uma entidade selecionando-os no Editor de Associação.

Por padrão, o Editor de Associação adiciona um método de Navegação de Associação às entidades de origem e de destino. Com um método de Navegação de Associação na entidade de origem, os consumidores podem recuperar uma lista de entidades de destino. Com um método de Navegação de Associação na entidade de destino os consumidores podem recuperar a entidade de origem relacionada a uma entidade de destino.

Você deve adicionar o código a cada um desses métodos para retornar as informações apropriadas. Também é possível adicionar outros tipos de métodos para dar suporte a cenários mais avançados. Para obter mais informações sobre cada um desses métodos, confira Operações com suporte.

Tipos de associações

Você pode criar dois tipos de associações no designer de BDC: associações baseadas em chave estrangeira e associações sem chave estrangeira.

Associação baseada em chave estrangeira

É possível criar uma associação baseada em chave estrangeira ao relacionar um identificador na entidade de origem a descritores de tipo definidos na entidade de destino. Com essa relação, os consumidores do modelo podem fornecer uma interface do usuário aprimorada para seus usuários. Por exemplo, um formulário no Outlook que permite a um usuário criar uma ordem de vendas que possa exibir clientes em uma lista suspensa; ou uma lista de pedidos de vendas no SharePoint que permite aos usuários abrir uma página de perfil para um cliente.

Para criar uma associação baseada em chave estrangeira, relacione identificadores e descritores de tipo que tenham o mesmo nome e tipo. Por exemplo, você pode criar uma associação baseada em chave estrangeira entre uma entidade Contact e uma entidade SalesOrder. A entidade SalesOrder retorna um descritor de tipo ContactID como parte do parâmetro de retorno dos métodos Localizador ou Localizador Específico. Ambos os descritores de tipo são exibidos no Editor de Associação. Para criar uma relação baseada em chave estrangeira entre a entidade Contact e a entidade SalesOrder, escolha o identificador ContactID ao lado de cada um desses campos.

Adicione o código ao método Navegador de Associação da entidade fonte que retorna uma coleção de entidades de destino. O exemplo a seguir retorna as ordens de vendas de um contato.

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

Adicione o código ao método Navegador de Associação da entidade de destino que retorna uma entidade de origem. O exemplo a seguir retorna o contato que está relacionado à ordem de vendas.

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;

}

Associação sem chave estrangeira

Você pode criar uma associação sem mapear identificadores para descritores de tipo de campo. Crie esse tipo de associação quando a entidade de origem não tiver uma relação direta com a entidade de destino. Por exemplo, uma tabela SalesOrderDetail não tem uma chave estrangeira que mapeia para uma chave primária em uma tabela Contact.

Se você quiser exibir informações na tabela SalesOrderDetail que estejam relacionadas a um Contact, poderá criar uma associação sem chave estrangeira entre a entidade Contact e a entidade SalesOrderDetail.

No método Navegação de Associação da entidade Contact, retorne as entidades SalesOrderDetail juntando tabelas ou chamando um procedimento armazenado.

O exemplo a seguir retorna detalhes de todas as ordens de vendas juntando tabelas.

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

No método Navegação de Associação da entidade SalesOrderDetail, retorne o Contact relacionado. O exemplo a seguir demonstra isso.

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