none
Melhores Práticas salvar entidades RRS feed

  • Pergunta

  • Olá galera, bom dia a todos.

    Estou seguindo um artigo que mostra como trabalhar com EF.6 utilizando repositorios.
    O arquivo é https://msdn.microsoft.com/pt-br/library/dn630213.aspx?f=255&MSPPError=-2147217396


    porém, fiquei na dúvida quanto ao salvar várias entidades relacionadas.

    no meu caso seria [Pessoas] -> [Endereços] e [Telefones]

    O código abaixo funciona, porém, achei que seria mal prática salvar entidades separadamente.

    using (var repositorioEntidade = new PessoaRepositorio()) // TENHO QUE CHAMAR TODAS AS ENTIDADES SEPARADAMENTE? using (var repositorioEndereco = new EnderecoRepositorio()) using (var repositorioTelefones = new TelefoneRepositorio()) { if (entidade.PessoaID == 0) repositorioEntidade.Adicionar(entidade); // ASSIM ELE SALVA ATÉ O ENDEREÇO, MESMO NAO INDICANDO SEPARADO else { // NO ATUALIZAR TENHO QUE INDICAR SEPARADO AS ENTIDADES? repositorioEntidade.Atualizar(entidade); repositorioEndereco.Atualizar(entidade.Endereco); }

    // NO RELACIONAMENTO 1 PARA MUITOS É NECESSÁRIO FAZER TODAS ESSAS COMPARACOES PARA SABER O QUE É NOVO OU DELETADO? var compara = new TelefoneComparar(); // realiza comparações List<Telefone> telefonesBancoDeDados = entidade.Telefones.ToList(); // telefones do banco de dados List<Telefone> telefonesEnviados = entidadeTelefones.ToList(); // telefones atualmente no form List<Telefone> telefonesNovos = telefonesEnviados.Except(telefonesBancoDeDados, compara).ToList(); // telefones enviados menos os do banco = telefones novos List<Telefone> telefonesDeletados = telefonesBancoDeDados.Except(telefonesEnviados, compara).ToList(); // telefones do banco - enviados = telefones deletados // Remove Telefones deletados foreach (var item in telefonesDeletados) repositorioTelefones.Excluir(t => t.TelefoneID == item.TelefoneID); // Adiciona telefones novos foreach (var item in telefonesNovos) entidade.Telefones.Add(item); repositorioTelefones.Commit(); // savechanges() repositorioEntidade.Commit(); repositorioEndereco.Commit(); } }

    caso eu nao tenha passado todas as informaçoes, meu código completo esta no github e esse código esta no link abaixo

    https://github.com/michaelgomes/CRM.GESTAO/blob/master/Repositorio.WindowsForms/frmPessoas.cs#L204

    quarta-feira, 24 de agosto de 2016 13:13

Respostas

  • Fala Michaell,

    Isso vai depender muito do seu designer de classes, mais presquise sobre os assuntos:

    Lazy Loading e Eager Loading

    Aggregate root em Domain Driven Design

    Você verá que atualizar tudo a partir da raz do agregado nos dar mais segurança quanto a transação e as 

    regras de negócio.

    Espero ter lhe ajudado, boa sorte.

    quarta-feira, 24 de agosto de 2016 15:26

Todas as Respostas

  • Olá Michaell,

    Na verdade, você precisa informar se a aplicação que você está fazendo será apenas para computadores ou ela será utilizada mobile.

    Uma boa prática é você tentar fazer o usuário cadastrar os dados do header (pessoa), então você pode inserir e remover os endereços ou os agregados no exato momento que o usuário está inserindo/editando/excluindo o agragado, a não ser que você deseje que o usuário tenha como "experiência" salvar o grafo do objeto todo.

    O usuário necessita realmente ter o cadastro como um todo gravado em uma única chamada?


    quarta-feira, 24 de agosto de 2016 14:58
  • sim, preciso muito que seja salvo o objeto todo de uma vez.. ao clicar em salvar


    nao quero que o usuario tenha que criar a pessoa para depois os telefones ou endereços.

    quarta-feira, 24 de agosto de 2016 15:20
  • Fala Michaell,

    Isso vai depender muito do seu designer de classes, mais presquise sobre os assuntos:

    Lazy Loading e Eager Loading

    Aggregate root em Domain Driven Design

    Você verá que atualizar tudo a partir da raz do agregado nos dar mais segurança quanto a transação e as 

    regras de negócio.

    Espero ter lhe ajudado, boa sorte.

    quarta-feira, 24 de agosto de 2016 15:26
  • Bom dia,

    Devido a falta de resposta do usuário

    essa thread está sendo fechada.

    Se o problema ainda estiver ocorrendo,

    favor abrir uma nova thread.

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 26 de agosto de 2016 13:19
    Moderador