none
EF Core Postgresql e 4 entidades com Herança como documentar usando fluent api RRS feed

  • Pergunta

  • Olá, estou desenvolvendo meu primeiro projeto com o Entity Framework com Postgresql, onde tenho 4 entidades com herança, Pessoa onde gravo os dados básicos e suas "filhas": Cliente, Fornecedor e Funcionário, quando estava utilizando a versão 6.x criou o banco perfeitamente, mas como estou no início do projeto resolvi mudar para o EF Core 2.2.3.0 e traduzi minhas classes de mapeamento Fluent Api, mas ao gerar o banco de dados as propriedades das 4 entidades foram incluídas na tabela Pessoa.

    Como devo mapear essa herança?

    Para evitar vários trechos de código vou resumir minhas classes em Pessoa e Cliente

        public class Pessoa : Entity
        {
            protected Pessoa()
            {
                this.Empresas = new List<Empresa>();
            }
    
            public Pessoa(Guid id, string nome, string apelido, DateTime dataNascimento, string cpfCnpj, string rg, string ie, string logradouro, string numero, string complemento, string bairro, Guid cidadeId, string cep, string telefone, string celular, string fax, string email)
            {
                Id = id;
                Nome = nome;
                Apelido = apelido;
                DataNascimento = dataNascimento;
                CpfCnpj = new CPFCNPJ(cpfCnpj);
                Rg = rg;
                IE = ie;
                Logradouro = logradouro;
                Numero = numero;
                Bairro = bairro;
                Complemento = complemento;
                CidadeId = cidadeId;
                Cep = cep;
                Telefone = telefone;
                Celular = celular;
                Fax = fax;
                Email = email;
            }
    
            public string Logradouro { get; private set; }
            public string Numero { get; private set; }
            public string Bairro { get; private set; }
            public string Complemento { get; private set; }
            public Guid CidadeId { get; private set; }
            public string Cep { get; private set; }
            public bool Principal { get; private set; }
            public string Nome { get; private set; }
            public string Apelido { get; private set; }
            public DateTime DataNascimento { get; private set; }
            public CPFCNPJ CpfCnpj { get; private set; }
            public string Rg { get; private set; }
            public string IE { get; private set; }
            public string Email { get; private set; }
            public string Telefone { get; private set; }
            public string Celular { get; private set; }
            public string Fax { get; private set; }
            public virtual Cidade Cidade { get; set; }
            public virtual ICollection<Empresa> Empresas { get; set; }
            
        }
    
    
        class PessoaMapping : IEntityTypeConfiguration<Pessoa>
        {
            public void Configure(EntityTypeBuilder<Pessoa> builder)
            {
                builder.ToTable("Pessoa");
    
                builder.HasKey(x => x.Id);
    
                builder.Property(x => x.Nome).IsRequired().HasMaxLength(100);
                builder.Property(x => x.Apelido).IsRequired().HasMaxLength(100);
                builder.Property(x => x.DataNascimento);
                builder.OwnsOne(x => x.CpfCnpj, cpf =>
                {
                    cpf.Property(c => c.Documento)
                    .IsRequired()
                    .HasColumnName("CPFCNPJ")
                    .HasMaxLength(14);
                });
    
                builder.Property(x => x.Rg).HasMaxLength(20);
                builder.Property(x => x.IE).HasMaxLength(20);
                builder.Property(x => x.Logradouro).HasMaxLength(150);
                builder.Property(x => x.Numero).HasMaxLength(10);
                builder.Property(x => x.Complemento).HasMaxLength(150);
                builder.Property(x => x.Bairro).HasMaxLength(100);
                builder.Property(x => x.CidadeId);
                builder.Property(x => x.Cep).HasMaxLength(9);
                builder.Property(x => x.Email).HasMaxLength(150);
                builder.Property(x => x.Telefone).HasMaxLength(15);
                builder.Property(x => x.Celular).HasMaxLength(15);
                builder.Property(x => x.Fax).HasMaxLength(15);
                
            }
        }

        public class Cliente : Pessoa
        {
            protected Cliente()
            { }
    
            public Cliente(Guid id, int codigoCliente, string nome, string apelido, DateTime dataNascimento, string cpfCnpj, string rg, string ie, string logradouro, string numero, string complemento, string bairro, Guid cidadeId, string cep, decimal limiteCredito, bool bloqueado, EFormaFechamento formaFechamento, byte diaFechamento, string telefone, string celular, string fax, string email, string observacao) : base(id, nome, apelido, dataNascimento, cpfCnpj, rg, ie, logradouro, numero, complemento, bairro, cidadeId, cep, telefone, celular, fax, email)
            {
                CodigoCliente = codigoCliente;
                LimiteCredito = limiteCredito;
                Bloqueado = bloqueado;
                Observacao = observacao;
                FormaFechamento = formaFechamento;
                DiaFechamento = diaFechamento;
            }
    
            public int CodigoCliente { get; private set; }
            public decimal LimiteCredito { get; private set; }
            public bool Bloqueado { get; private set; }
            public string Observacao { get; private set; }
            public EFormaFechamento FormaFechamento { get; private set; }
            public byte DiaFechamento { get; private set; }
            
            public new void EhValido()
            {
                base.EhValido();
                this.LimiteCreditoScopeValido();
                this.DiaFechamentoScopeValido();
                this.ObservacaoScopeValido();
            }
        }
    
        class ClienteMapping : IEntityTypeConfiguration<Cliente>
        {        
            public void Configure(EntityTypeBuilder<Cliente> builder)
            {
                builder.ToTable("Cliente");
                           
                builder.Property(x => x.CodigoCliente).IsRequired();
                builder.Property(x => x.LimiteCredito).IsRequired();
                builder.Property(x => x.FormaFechamento).IsRequired();
                builder.Property(x => x.DiaFechamento).IsRequired();
                builder.Property(x => x.Observacao).HasMaxLength(1000);
    
            }
        }

        public class MeuContext : DbContext
        {        
            public DbSet<Pessoa> Cadastros { get; set; }
            public DbSet<Cliente> Clientes { get; set; }
    
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseNpgsql(@"server=localhost; Port=5432; user id=postgres; password=1a2b3c4d5e@!#; database=banco;");
                
            }
    
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
    
                modelBuilder.ApplyConfiguration(new PessoaMapping());
                modelBuilder.ApplyConfiguration(new ClienteMapping());
                base.OnModelCreating(modelBuilder);
    
            }
        }


    • Editado Valdeir Caires sexta-feira, 29 de março de 2019 11:45 grafia
    sexta-feira, 29 de março de 2019 11:45

Todas as Respostas