Circular relationship with Entityframework Core

Asked

Viewed 549 times

1

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

"The navigation Property 'Personal' cannot be Added to the Entity type 'Personal Signup' because a Property with the same name already exists on Entity type 'Personal Signup'."

I need the relationship to stay that way on the bench:

inserir a descrição da imagem aqui

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

        public virtual PessoaNatureza PessoaNatureza { get; set; }
        public virtual PessoaFisica PessoaFisica { get; set; }
        public virtual PessoaJuridica PessoaJuridica { get; set; }

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

        public static Pessoa CreateNew (int pessoaId, PessoaNatureza pessoaNatureza)
        {
            return new Pessoa
            {
                PessoaId = pessoaId,
                PessoaNatureza = pessoaNatureza                
            };
        }
    }


}

public class PessoaCadastro
{
        public int PessoaId { get; private set; }
        public int Id { get; private set; }
        public DateTime DataInclusao { get; private set; }


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

        public static PessoaCadastro CreateNew(int pessoaId, int id, Pessoa pessoaFilial, DateTime dataInclusao)
        {
            return new PessoaCadastro()
            {
                PessoaId = pessoaId,
                Id = id,
                PessoaFilial = pessoaFilial,
                DataInclusao = dataInclusao
            };
        }
    }

public class PessoaCadastroMap : IEntityTypeConfiguration<PessoaCadastro>
{
        public void Configure(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 I need to mess with my mapping for it to work?

  • These relationships are just like that, what the purpose?

  • Yes, they are. I have more tables involved, but it would be unnecessary to quote them here. The Personal table Registration must store the Codes (Id) of my Customers, Suppliers, Affiliates, Carriers, etc. It stores tb, the Branch Code (Personal) so I know which branch belongs to the register.

1 answer

3


Basically by the model of your question (and consequently by the comment that the other entities are not required to quote) the functional configuration model 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);
    });            
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.