Inquiridor
EF insert herança

Pergunta
-
Estou tentando inserir o mesmo dado em diferentes classes pertencente da mesma herança, porém não estou conseguindo manter o mesmo registro na tabela base.
por exemplo, tenho a classe base Pessoa, PessoaJuridica herda de Pessoa, Cliente herda de PessoaJuridica e Empresa herda de PessoaJuridica, então, gostaria de incluir a mesma Pessoa tanto em Cliente como Empresa
segue o código que estou tentando executar.
class Program { static void Main(string[] args) { Empresa empresa = IncluirEmpresa(); Cliente cliente = IncluirCliente(empresa); TesteContext teste = new TesteContext(); var dados = from t in teste.Pessoa select t; foreach (var dado in dados) { Console.WriteLine("{0} - {1}", dado.PessoaId, dado.Nome); } } private static Cliente IncluirCliente(Empresa empresa) { Cliente cliente = new Cliente() { Cnpj = empresa.Cnpj, Email = "a@a.com", Nome = empresa.Nome, PessoaId = empresa.PessoaId }; TesteContext teste = new TesteContext(); teste.Cliente.Add(cliente); teste.SaveChanges(); return cliente; } private static Empresa IncluirEmpresa() { TesteContext teste = new TesteContext(); Empresa empresa = new Empresa(); empresa.Cnpj = "123123"; empresa.InscricaoEstadual = "321321"; empresa.Nome = "NOme"; teste.Empresa.Add(empresa); teste.SaveChanges(); return empresa; } } public class TesteContext : DbContext { public DbSet<Pessoa> Pessoa { get; set; } public DbSet<PessoaJuridica> PessoaJuridica { get; set; } public DbSet<Empresa> Empresa { get; set; } public DbSet<Cliente> Cliente { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); Database.SetInitializer(new DropCreateDatabaseAlways<TesteContext>()); base.OnModelCreating(modelBuilder); } } public class Pessoa { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int PessoaId { get; set; } [Required] public string Nome { get; set; } } public class PessoaJuridica : Pessoa { public string Cnpj { get; set; } } public class Empresa : PessoaJuridica { public string InscricaoEstadual { get; set; } } public class Cliente : PessoaJuridica { public string Email { get; set; } }
resultado em tela
1 - NOme
2 - NOmeonde gostaria que só tivesse a pessoa de Id 1
Todas as Respostas
-
Pablotdv
Existe um conceito criado por Eric Evans que é o pai do que conhecemos por DDD (Domain-Driven-Design), que diz que nesse cenário que você esta devemos trabalhar com "Agregado" que nada mas é do que um conjuntos de propriedades e classes que consistiu um conjunto, onde um agregado deve possuir sua base(raiz) e nunca propriedade/classes interna deve acessar as internas.
Ou seja, você sempre deve descer, por exemplo obter uma instância do objeto Pessoa, comportar essa instancia com um objecto PessoaJuridica que deve ser comporto por um objeto Cliente e no final de tudo você manda chama o método SaveChanges() para o objeto base Pessoa.
Entendeu a teoria?
Aparantemente sua idéia esta correta, um cliente possui uma ou mais empresas, porém você tem que chamar o objeto SaveChanges para o agregado e não para os elementos ( classes do agregado ).
Espero ter ajudado,
Abraços,
Leandro Rodrigues
Caso a resposta tenha ajudado, não esqueça de marcar como resposta válida
-