Usuário com melhor resposta
CodeFirst Relacionamento Pessoas (cliente / entregador)

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
Respostas
-
Olá,
Tenta ver essa thread, ela fala exatamente disso...acredito que você tenha que usar a data annotation "InverseProperty".
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
Todas as Respostas
-
Olá,
Tenta ver essa thread, ela fala exatamente disso...acredito que você tenha que usar a data annotation "InverseProperty".
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
-
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