Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Dúvida de mapeamentos de relacionamentos e inserção no banco

Galera é o seguinte, eu tenho uma tabela Vendedor, outra TipoVendedor e nessas tenho o VendedorTipo indicando as chaves das outras duas e com colunas para servir como um histórico para a empresa quando precisar. Na regra de negócio implementada aqui, o relacionamento entre Vendedor e TipoVendedor é 1 : 1, e fiz o entity gerar os models e a implementação de DbContext porque a base já é existente (Database First) através daquele comando Scaffold-DbContext.

Agora é o seguinte na hora de eu adicionar um vendedor no banco como devo fazer, porque dessa forma me parece que preciso adicionar o Vendedor depois a TipoVendedor e depois a VendedorTipo, tendo que toda hora recuperar as chaves dessas outras duas tabelas para adicionar na outra, e isso não é legal nem consistente certo? Queria adicionar uma tabela no banco como no curso, onde adicionaria o Vendedor ou a TipoVendedorno banco e o entity cuidava das outras duas.

Segue códigos e entidades para melhor entendimento: https://gist.github.com/anonymous/b2f27e75c8e7b654a3d44bf09f82b00e

Tem outras entidades e mapeamentos, mas solucionando essa dúvida creio que consigo fazer para as outras, a forma que tá foi o entity que fez pra mim e o banco foi feito dessa forma pela regra de negócio da empresa. Qualquer dúvida me pergunta.

Agradeço quem puder ajudar, valeu!

5 respostas

Olá Lucas,

se você quiser trabalhar com objetos ao invés dos identificadores, como no curso, uma coisa que você precisa fazer é adicionar nas suas classes as propriedades que ligam com as outras com quem ela se relaciona. Por exemplo, sua classe VendedorTipo deveria ter uma propriedade do tipo Vendedor, igual a classe Endereco tem a propriedade Cliente no curso. Que ai incluindo a referência para do objeto Vendedor no VendedorTipo, o Entity vai se virar para incluir isto no banco. Mas para isso funcionar você também precisará no seu Context indicar como é o relacionamento, traduzido a forma como está criada no seu banco. É bem parecido com o que foi feito no curso, mas aqui segue um link com um tutorial do próprio entity framework core que mostra como é este mapeamento para um relacionamento one to one. Neste tutorial eles mostram também como fazer para one to many e many to many.

Valeu Lucas, lendo a doc fica mais complexo entender, mas acho que esse links vai me ajudar muito daqui em diante!

Lucas, tava verificando aqui, eu vou fazer assim, faço a classe VendedorTipo armazenar duas propriedades do tipo Vendedor e TipoVendedor, ai na hora de armazenar o entity através do changeTracker creio que vai analisar que não tem ainda essas classes armazenadas e vai armazená-las sem eu ter que ficar recuperando a referencia igual no curso. Só que como fale essa classe Vendedor vai ter mais vinculos como nesse exemplo que vai ser com a entidade Email tendo uma chamada VendedorEmail armazenando a referencia das duas entidade, assim como também com outra chamada Endereço e assim por diante.

Ai fica minha dúvida sobre como armazenar isso, que cairia naquela parte de recuperar referencia toda hora pra armazenar esses outros tipos, como eu faria pra dizer ao entity que quero armazenar tudo isso de uma vez sem criar uma nova tabela, como por exemplo:

public class ArmazenadorVendedores{
    public VendedorEmail VendedorEmail {get; set;}
    public VendedorEndereco VendedorEndereco {get; set;}
    public VendedorTipo VendedorTipo{get; set;}
}

E no contexto colocar algo do tipo;

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
        //outros...

            //Armazena o vendedor de uma vez
            modelBuilder.Entity<ArmazenadorVendedores>(entity =>
            {
                entity. //métodos que faz armazenar sem ter que criar a tabela ArmazenadorVendedores e que faz adicionar todas entidades dessa classe em suas tabelas...
            }
    }

Entendeu? Se puder ajudar nessa força ai valeu mano!

solução!

Olá Lucas,

se entendi direito sua dúvida, pelo que me parece esta sua classe ArmazenadorVendedores é justamente a sua classe Vendedor. Ela pode ter propriedades de VendedorEmail, VendedorEndereco e VendedorTipo e quando você cadastrar um Vendedor, se as propriedades estiverem preenchidas, ele também adicionará as outras informações nas tabelas corretas. E se você configurar o Context bonitinho com o ToTable ele não cria novas tabelas, mas sim adiciona nas já existentes.

Então tem como sim eu fazer isso, sem criar a tabela ArmazenadorVendedores, vou tentar aqui!