Many-To-Many Relationship Mapping - EF Core - C #

4

I've tried to map a relationship between 3 classes, but I'm catching up. I have a Person class that represents any Person, an Employee, a Client, a Supplier, any kind of Person, be it physical or legal ... When I register a certain type of person, I will need to use the PersonCadastro table to Note that many fields have a relationship with the PersonId field of tblPeople (except the Id field, as it will only be a PK field and does not relate to any fields), but I can not do with the foreign keys getting right ... The result I got was this:

WhatdoIneedtochangeinmyclassesandmapping?

InthedatabaseIneedthetablestolooklikethis:

public class Pessoa
    {
        public int PessoaId { get; set; }
        public int PessoaTipoId { get; set; }

        public virtual PessoaTipo PessoaTipo { get; set; }
        public virtual PessoaFisica PessoaFisica { get; set; }
        public virtual PessoaJuridica PessoaJuridica { get; set; }
        public virtual ICollection<PessoaCadastro> PessoasCadastros { get; set; }

    }

public class PessoaCadTipo
    {
        public int PessoaCadTipoId { get; set; }
        public string Descricao { get; set; }
        public bool Sistema { get; set; }
        public DateTime DataInclusao { get; set; }

        public virtual ICollection<PessoaCadastro> PessoasCadastros { get; set; }
    }

public class PessoaCadastro
    {
        public int PessoaId { get; set; }
        public int PessoaCadTipoId { get; set; }
        public int Id { get; set; }
        public int PessoaFilialId { get; set; }
        public int PessoaFilialCadId { get; set; }
        public int PessoaFuncCadId { get; set; }
        public DateTime DataInclusao { get; set; }
        public bool Sistema { get; set; }

        public virtual Pessoa Pessoa { get; set; }
        public virtual PessoaCadTipo PessoaCadTipo { get; set; }

    }

//Mapeamento da Classe PessoaCadastro
public void PessoaCadastroMapping(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<PessoaCadastro>()
                .ToTable("tblPessoaCadastro");

            modelBuilder.Entity<PessoaCadastro>()
                .HasKey(p => new {p.PessoaId, p.PessoaCadTipoId, p.Id, p.PessoaFilialId });

            modelBuilder.Entity<PessoaCadastro>()
                .HasOne(p => p.Pessoa)
                .WithMany(p => p.PessoasCadastros)
                .HasForeignKey(p => p.PessoaId)
                .HasConstraintName("FK_Pessoa_PessoaCad")
                .IsRequired();

            modelBuilder.Entity<PessoaCadastro>()
                .HasOne(p => p.PessoaCadTipo)
                .WithMany(p => p.PessoasCadastros)
                .HasForeignKey(p => p.PessoaCadTipoId)
                .HasConstraintName("FK_PessoaCadTipo_PessoaCad")
                .IsRequired();

            modelBuilder.Entity<PessoaCadastro>()
                .HasOne(p => p.Pessoa)
                .WithMany(p => p.PessoasCadastros)
                .HasForeignKey(p => p.PessoaFilialId)
                .HasConstraintName("FK_PessoaFilial_PessoaCad")
                .IsRequired();

            modelBuilder.Entity<PessoaCadastro>()
                .HasOne(p => p.Pessoa)
                .WithMany(p => p.PessoasCadastros)
                .HasForeignKey(p => p.PessoaFilialCadId)
                .HasConstraintName("FK_PessoaFilialCad_PessoaCad")
                .IsRequired();

            modelBuilder.Entity<PessoaCadastro>()
                .HasOne(p => p.Pessoa)
                .WithMany(p => p.PessoasCadastros)
                .HasForeignKey(p => p.PessoaFuncCadId)
                .HasConstraintName("FK_PessoaFuncCad_PessoaCad")
                .IsRequired();

            modelBuilder.Entity<PessoaCadastro>()
                .Property(p => p.Sistema)
                .HasColumnName("Sistema")
                .HasColumnType("Bit");

            modelBuilder.Entity<PessoaCadastro>()
                .Property(p => p.DataInclusao)
                .HasColumnName("DataInclusao")
                .HasColumnType("DateTime")
                .IsRequired();
        }
    
asked by anonymous 29.05.2017 / 23:52

1 answer

5

No need to complicate so much. Let's first analyze your case:

  

I have a Person class that represents any Person, an Employee, a Client, a Supplier, in short, any type of Person, whether physical or legal.

In my opinion, a person can only be either physical or legal, but can also be a customer, a supplier, both or none.

That is, Pessoa , PessoaFisica , and PessoaJuridica are cases of inheritance, as explained here . Cliente and Fornecedor are composite cases, as I explain here .

  

When I register a particular type of person, I will need to use the PersonCadastro table to be able to store more specific data for each person.

You do not have to. See the answers.

  

What do I need to change in my classes and mapping?

Well, put the two answers together and you'll get what you're looking for. Get rid of Fluent API too. You do not need it.

    
30.05.2017 / 00:11