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