none
EF insert herança RRS feed

  • 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 - NOme

    onde gostaria que só tivesse a pessoa de Id 1

    segunda-feira, 6 de maio de 2013 19:17

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

    terça-feira, 7 de maio de 2013 17:56
  • Eu resolvi isso desfazendo a herança de Cliente e Empresa para PessoaJuridica.

    Gostei até de como ficou a estrutura do meu sistema.

    quarta-feira, 8 de maio de 2013 02:47