none
CodeFirst Relacionamento Pessoas (cliente / entregador) RRS feed

  • Pergunta

  • Tenho uma Entidade chamado PESSOAS... no qual utilizo para cadastrar:
        CLIENTES
        COLABORADORES
        FORNECEDORES

    É mesma Entidade, mesmo form, tudo igual.
    O usuário apenas deve escolher qual é o TIPO DE PESSOA no momento do cadastro.


    Porém, na Entidade PEDIDOS preciso relacionar 2x com a entidade PESSOAS...
    1x para indicar a PESSOA_CLIENTE e 1x para indicar PESSOA_COLABORADOR

    // Resumo da Minha Entidade Pessoa
    public class Pessoa
    {
            public int PessoaID { get; set; }
            public TipoPessoa Tipo { get; set; }
            public string Nome { get; set; }
            public virtual ICollection<Pedido> Pedidos { get; set; }
    
            public enum TipoPessoa
            {
                Cliente,
                Colaborador,
                Fornecedor
            }
    }
    



    // Resumo da Minha Entidade Pedido

    public class Pedido
    {
            public int PedidoID { get; set; }
            public DateTime Data { get; set; } = DateTime.Now;
            
            public int Cliente_PessoaID { get; set; }
            public int Entregador_PessoaID { get; set; }
    }




    Utilizando CodeFirst, fiz o relacionamento da seguinte forma
                // Relacionamento Pedido > Cliente
                HasRequired(p => p.Cliente) // 1 PEDIDO PRECISA DE UM CLIENTE
                    .WithMany(c => c.Pedidos) // 1 CLIENTE TEM MUITOS PEDIDOS (1 PARA MUITOS)
                    .HasForeignKey(p => p.Cliente_PessoaID) // DEFININDO CHAVE ESTRANGEIRA
                    .WillCascadeOnDelete(false); // SE EXCLUIR CLIENTE, EXCLUIR PEDIDOS?
    
    
                // Relacionamento Pedido > Entregador
                HasRequired(p => p.Cliente) // 1 PEDIDO PRECISA DE UM ENTREGADOR
                    .WithMany(c => c.Pedidos) // 1 ENTREGADOR TEM MUITOS PEDIDOS (1 PARA MUITOS)
                    .HasForeignKey(p => p.Entregador_PessoaID) // CHAVE ESTRANGEIRA
                    .WillCascadeOnDelete(false); // SE EXCLUIR ENTREGADOR, EXCLUIR PEDIDOS?
    
    


    mas ao adicionar o Migrations para criar as tabelas.. o migrations nao identificou a chave estrangeira do segundo relacionamento e criou outra. veja como o Migrations identificou
    CreateTable(
                    "dbo.Pedido",
                    c => new
                        {
                            PedidoID = c.Int(nullable: false, identity: true),
                            Data = c.DateTime(nullable: false, storeType: "smalldatetime"),
                            Cliente_PessoaID = c.Int(nullable: false),
                            Entregador_PessoaID = c.Int(nullable: false),
                            Entregador_PessoaID1 = c.Int(),      // CRIOU OUTRA SOZINHO
                        })
                    .PrimaryKey(t => t.PedidoID)
                    .ForeignKey("dbo.Cliente", t => t.Entregador_PessoaID)
                    .ForeignKey("dbo.Cliente", t => t.Entregador_PessoaID1)
                    .Index(t => t.Entregador_PessoaID)
                    .Index(t => t.Entregador_PessoaID1);
    
    


    A chave estrangeira Cliente_PessoaID foi identificado normalmente.
    mas a chave Entregador_PessoaID não foi identificado e foi criado outro Entregador_PessoaID1 automaticamente


    onde estou errando nesse relacionamento?
    • Editado DevMaicon terça-feira, 9 de agosto de 2016 00:15
    segunda-feira, 8 de agosto de 2016 23:32

Respostas

Todas as Respostas

  • Olá,

    Tenta ver essa thread, ela fala exatamente disso...acredito que você tenha que usar a data annotation "InverseProperty".

    http://stackoverflow.com/questions/28570916/defining-multiple-foreign-key-for-the-same-table-in-entity-framework-code-first

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    • Marcado como Resposta DevMaicon terça-feira, 9 de agosto de 2016 13:41
    terça-feira, 9 de agosto de 2016 11:26
  • perfeito muito obrigado.

    no meu caso funcionou assim..

    na Entidade Pessoa, troquei

     public virtual ICollection<Pedido> Pedidos { get; set; }

    por

    public virtual ICollection<Pedido> ClientePedidos { get; set; }

    e acrescentei

    public virtual ICollection<Pedido> EntregadorPedidos { get; set; }

    meu relacionamento no map ficou assim:

      // Relacionamento Pedido > Cliente
                HasRequired(m => m.Cliente)
                    .WithMany(m => m.ClientePedidos)
                    .HasForeignKey(p => p.Cliente_PessoaID)
                    .WillCascadeOnDelete(false);
    
                // Relacionamento Pedido > Entregador
                HasRequired(m => m.Entregador) // 1 PEDIDO PRECISA 1 ENTREGADOR
                    .WithMany(m => m.EntregadorPedidos)  // 1 ENTREGADOR TEM MUITOS PEDIDOS (1 PARA MUITOS)
                    .HasForeignKey(p => p.Entregador_PessoaID) // CHAVE ESTRANGEIRA 
                    .WillCascadeOnDelete(false); // SE EXCLUIR ENTREGADOR, EXCLUIR PEDIDOS
    muito obrigado mesmo.
    valew pela ajuda

    terça-feira, 9 de agosto de 2016 13:44