Circular relationship with EntityFramework Core

1

I need to relate the Person with Person entity to the Person using the EF Core, but is giving the following error in Migrations:

  

"The navigation property 'PersonFilial' can not be added to the entity type 'PersonCadastro' because a property with the same name already exists on entity type 'PersonCadastro'."

I need the relationship to stay that way in the bank:

  

publicclassPessoa{publicintPessoaId{get;privateset;}publicvirtualPessoaNaturezaPessoaNatureza{get;set;}publicvirtualPessoaFisicaPessoaFisica{get;set;}publicvirtualPessoaJuridicaPessoaJuridica{get;set;}publicvirtualICollection<PessoaCadastro>PessoasCadastros{get;set;}publicvirtualICollection<PessoaCadastro>PessoaCadastroPessoasFiliais{get;set;}publicstaticPessoaCreateNew(intpessoaId,PessoaNaturezapessoaNatureza){returnnewPessoa{PessoaId=pessoaId,PessoaNatureza=pessoaNatureza};}}}
publicclassPessoaCadastro{publicintPessoaId{get;privateset;}publicintId{get;privateset;}publicDateTimeDataInclusao{get;privateset;}publicvirtualPessoaTipoPessoaTipo{get;set;}publicvirtualPessoaPessoa{get;set;}publicvirtualPessoaPessoaFilial{get;set;}publicstaticPessoaCadastroCreateNew(intpessoaId,intid,PessoapessoaFilial,DateTimedataInclusao){returnnewPessoaCadastro(){PessoaId=pessoaId,Id=id,PessoaFilial=pessoaFilial,DataInclusao=dataInclusao};}}
publicclassPessoaCadastroMap:IEntityTypeConfiguration<PessoaCadastro>{publicvoidConfigure(EntityTypeBuilder<PessoaCadastro>builder){builder.ToTable("PessoaCadastro");

            builder.HasKey(pc => new { pc.Id, pc.PessoaTipo, pc.PessoaId, pc.PessoaFilial });

            builder.Property(pc => pc.PessoaTipo)
                .HasColumnName("PessoaTipoId")
                .HasColumnType("int")
                .IsRequired();

            builder
                .HasOne(p => p.Pessoa)
                .WithMany(p => p.PessoasCadastros)
                .HasForeignKey(p=> p.PessoaId)
                .IsRequired();

            builder.Property(pc => pc.PessoaId)
                .HasColumnName("PessoaId")
                .HasColumnType("int")
                .IsRequired();

            builder
                .HasOne(p => p.PessoaFilial)
                .WithMany(p => p.PessoaCadastroPessoasFiliais)
                .HasForeignKey(p=> p.PessoaFilial)
                .IsRequired();

            builder.Property(pc => pc.PessoaFilial)
               .HasColumnName("PessoaFilialId")
               .HasColumnType("int")
               .IsRequired();
        }
    }

What do I need to do in my mapping to work?

    
asked by anonymous 21.12.2017 / 00:29

1 answer

3

Basically by the model of your question ( and consequently by the comment that says that other entities are not necessary to quote ) the functional model of configuration is:

Models

public partial class Pessoa
{
    public Pessoa()
    {
        PessoaCadastroPessoa = new HashSet<PessoaCadastro>();
        PessoaCadastroPessoaFilial = new HashSet<PessoaCadastro>();
    }

    public int PessoaId { get; set; }
    public string Nome { get; set; }

    public ICollection<PessoaCadastro> PessoaCadastroPessoa { get; set; }
    public ICollection<PessoaCadastro> PessoaCadastroPessoaFilial { get; set; }
}
public partial class PessoaCadastro
{
    public int PessoaId { get; set; }
    public string Id { get; set; }
    public int PessoaFilialId { get; set; }
    public int? PessoaFuncInsclusao { get; set; }

    public Pessoa Pessoa { get; set; }
    public Pessoa PessoaFilial { get; set; }
}

Settings:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Pessoa>(entity =>
    {
        entity.HasKey(x => x.PessoaId);
        entity.Property(x => x.PessoaId)
            .UseSqlServerIdentityColumn();                
        entity.Property(e => e.Nome)
            .HasColumnType("nchar(10)");
    });

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

        entity.Property(e => e.Id).HasColumnType("nchar(10)");

        entity.HasOne(d => d.PessoaFilial)
            .WithMany(p => p.PessoaCadastroPessoaFilial)
            .HasForeignKey(d => d.PessoaFilialId)
            .OnDelete(DeleteBehavior.ClientSetNull);

        entity.HasOne(d => d.Pessoa)
            .WithMany(p => p.PessoaCadastroPessoa)
            .HasForeignKey(d => d.PessoaId)
            .OnDelete(DeleteBehavior.ClientSetNull);
    });            
}
    
21.12.2017 / 12:54