Usuário com melhor resposta
Melhores Práticas salvar entidades

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
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.
- Marcado como Resposta Robson William SilvaModerator sexta-feira, 26 de agosto de 2016 13:19
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?
-
-
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.
- Marcado como Resposta Robson William SilvaModerator sexta-feira, 26 de agosto de 2016 13:19
-
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.