Estrutura de entidade:Mapeando tabelas existentes sem integridade referencial
-
13-12-2019 - |
Pergunta
Neste cenário, tenho um banco de dados existente com três modelos:
Address
, que tem um 'AddressId', 'ParentId', 'City', 'State', etc.
Person
, que possui um 'PersonId', 'Name', etc.
Company
, que tem um 'CompanyId', 'Name', etc.
Porque Address
pode conter linhas para mais modelos do que apenas uma tabela, não há chave estrangeira;o Address
a coluna 'ParentId' conteria um 'PersonId' ou 'CompanyId'.
Para gerar meu DbContext
, usei o Entity Framework Power Tools Beta 2.Devido à falta de integridade referencial, as classes geradas para Person
e Company
não contêm uma coleção de endereços como deveriam.
Como eu alteraria essas classes para adicionar esta propriedade "Endereços" e garantiria que ela fosse mapeada corretamente para a tabela de endereços?
No momento estou fazendo algo assim;Prefiro que o contexto mapeie, se possível:
public IEnumerable<Address> Addresses
{
get
{
IEnumerable<Address> addresses = null;
using(MyDb db = new MyDb())
{
addresses = db.Addresses.Where(a => a.ParentId == this.PersonId)
}
return addresses;
}
}
Obrigado!
Solução
Se possível, você deve adicionar um ID exclusivo à tabela de endereços e, em seguida, armazenar esse ID com a entidade à qual pertence, seja uma pessoa, empresa, fornecedor, etc.
Se não for possível devido ao cenário de vários endereços, você poderá criar uma nova tabela AddressXRef que armazene os GUIDs das entidades (fornecedor, pessoa, empresa, etc.) e o GUID do endereço;portanto, cada entidade poderá ter vários endereços e a EF ficará muito feliz com esta configuração, pois haverá chaves por toda parte.
(Eu também gostaria de algum tipo de indicador de tipo de endereço na tabela Xref para saber que tipo de endereço era, correspondência, remessa, etc.)
Outras dicas
Crie classes parciais para ambos Company
e Person
que possuem aquela propriedade que você criou nele.
public partial class Company
{
public IEnumerable<Address> Addresses { ... }
}