Tenho um debate mental comigo mesmo toda vez que começo a trabalhar em um novo projeto e estou criando meus POCOs. Tenho visto muitos tutoriais / exemplos de código que parecem favorecer associações de chave estrangeira :
Associação de chave estrangeira
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; } // <-- Customer ID
...
}
Ao contrário de associações independentes :
Associação independente
public class Order
{
public int ID { get; set; }
public Customer Customer { get; set; } // <-- Customer object
...
}
Já trabalhei com o NHibernate no passado e usei associações independentes, que não só parecem mais OO, mas também (com carregamento lento) têm a vantagem de me dar acesso a todo o objeto Cliente, em vez de apenas seu ID. Isso me permite, por exemplo, recuperar uma instância Order e, em seguida, fazer Order.Customer.FirstName
sem ter que fazer uma junção explicitamente, o que é extremamente conveniente.
Então, para recapitular, minhas perguntas são:
- Existem desvantagens significativas no uso de associações independentes? e...
- Se não houver nenhuma, qual seria a razão de usar associações de chave estrangeira?
fonte
Use ambos. E torne suas referências de entidade virtuais para permitir o carregamento lento. Como isso:
Isso economiza em pesquisas desnecessárias no banco de dados, permite o carregamento lento e permite que você veja / defina o ID facilmente se souber o que deseja que seja. Observe que ter ambos não altera a estrutura da tabela de forma alguma.
fonte
A associação independente não funciona bem com o
AddOrUpdate
que geralmente é usado noSeed
método. Quando a referência for um item existente, ele será reinserido.O resultado é que o cliente existente será reinserido e o novo (reinserido) cliente será associado ao novo pedido.
A menos que usemos a associação de chave estrangeira e atribuamos o id.
Temos o comportamento esperado, o cliente existente será associado a um novo pedido.
fonte
var order = new Order { Id = 1, Customer = db.Customers.Find(1) };
Ou você pode usar o método Select para carregar o cliente do contexto do banco de dados. Isso funciona com associação independente.Sou a favor da abordagem do objeto para evitar pesquisas desnecessárias. Os objetos de propriedade podem ser facilmente preenchidos quando você chama seu método de fábrica para construir a entidade inteira (usando código de retorno de chamada simples para entidades aninhadas). Não há desvantagens que eu possa ver, exceto pelo uso de memória (mas você armazenaria seus objetos em cache, certo?). Portanto, tudo o que você está fazendo é substituir o heap pela pilha e obter um ganho de desempenho por não realizar pesquisas. Espero que isto faça sentido.
fonte