REGISTRO DE PESSOAS - CLIENTES, FORNECEDORES...

MICHAELL 23/08/2016 01:16:28
#466086
Citação:

:
:
KERPLUNK? DS2T? ACCIOLLY? XLEGENDARY?
por favor, quem puder me ajudar agradeço
Ora, mas é o que viemos discutindo no tópico todo...


mas gostaria de saber referente ao projeto que postei..
estou utilizando o padrao repositorio... mas nao sei se seria dessa forma que se faz quando há tabelas relacionadas
KERPLUNK 23/08/2016 22:31:03
#466109
Pelo que pude notar, com o telefone você fez de um jeito onde cliente pode ter muitos telefones(1->N). Mas para o endereço, o cliente tem apenas um endereço(1->1)
MICHAELL 24/08/2016 09:59:00
#466125
Citação:

:
Pelo que pude notar, com o telefone você fez de um jeito onde cliente pode ter muitos telefones(1->N). Mas para o endereço, o cliente tem apenas um endereço(1->1)



sim, vou mudar isso.. pretendo separar tudo.

porém, minha dúvida maior é se tenho que salvar entidades separadamente.
Observe como ficou meu método Salvar() apenas para Pessoas > Endereços e Telefones.
tenho que chamar o repositorio e o saveChanges de cada entidade separadamente?
Pergunto pois ficaria um código bem extenso caso separasse bairros, cidades, estados,...

gostaria apenas de chamar a entidade principal no caso pessoa

e outra dúvida é em questao dos telefones, que sao 1->N tenho que comparar manualmente com o banco o que é telefone novo, alterado ou excluido?
veja meu metodo salvar abaixo:

   using (var repositorioEntidade = new PessoaRepositorio())
using (var repositorioEndereco = new EnderecoRepositorio())
using (var repositorioTelefones = new TelefoneRepositorio())

{ // entidade = pessoa
if (entidade.PessoaID == 0)
repositorioEntidade.Adicionar(entidade); // Aqui ele salva o Endereço normalmente

else
{
repositorioEntidade.Atualizar(entidade);
repositorioEndereco.Atualizar(entidade.Endereco); // aqui tenho que Atualizar separado pois se nao ele nao atualiza
}

var compara = new TelefoneComparar(); // realiza comparações para saber o que é novo ou deletado
List<Telefone> telefonesBancoDeDados = entidade.Telefones.ToList(); // telefones banco de dados
List<Telefone> telefonesEnviados = entidadeTelefones.ToList(); // telefones atualmente no form
List<Telefone> telefonesNovos = telefonesEnviados.Except(telefonesBancoDeDados, compara).ToList(); // telefones novos
List<Telefone> telefonesDeletados = telefonesBancoDeDados.Except(telefonesEnviados, compara).ToList(); // 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);


// SaveChanges()
repositorioTelefones.Commit();
repositorioEntidade.Commit();
repositorioEndereco.Commit();




}




é correto fazer o que estou fazendo? salvando entidades separamente? pois pode dar problema caso salva uma entidade e outra nao.
acredito que seja simples e eu esteja complicando a situação.

agradeço atenção e se puderem me ajudar

esse código esta no github no link abaixo:

https://github.com/michaelgomes/CRM.GESTAO/blob/master/Repositorio.WindowsForms/frmPessoas.cs#L204
LAMPIAO 24/08/2016 14:39:45
#466134
Olá Michael, vou dar umas sugestões baseado no que eu uso aqui.

Bom pra começar eu não uso interface e repositório genérico, sempre crio eles exatamente com o tipo de objeto que vou trabalhar, isso
é uma questão de gosto, mas é bem mais fácil trabalhar com algo especializado do que com algo genérico.

Insert e Update, use métodos separados, tente especializar o repositório o máximo possível, um método com muitas linhas, já é sinônimo de
que algo não esta sendo bem feito.

Na classe pessoa já traga ela com as propriedades telefone e endereço preenchidas, da forma que você ta fazendo ta errado,
pode funcionar claro, mas não é o jeito correto, com o objeto pessoa com suas propriedades preenchidas e isso incluem os telefones e endereços,
você só precisa de um único SaveChanges,

Não sei como seria isso usando generics, não tenho nada implementado aqui assim, Mas você já tem pronto então pode testar ai.

Outra coisa os métodos Insert e Update, ou qualquer outro método que fara inserção ou atualização no banco tem que receber o objeto no caso pessoa
já validado, e não ficar validando dentro desses métodos.

Use resources para colocar as mensagens de validação, isso facilita a manutenção e troca de idioma, tem muita anotação não suas classes,
se o seu foco for apenas windows forms beleza, caso contrário não vão servir pra muita coisa é codificação a toa, isso pode ficar na classe de validação.

O contexto pode ser injetado no construtor do repositório pessoa, assim elimina o fato de instancia-lo em cada método.

Seu insert ficaria +- assim

_db.Pessoa.Add(model);
_db.SaveChanges();

Já o update você tem que recuperar do banco e passar os novos valores que veio no model.

Outra coisa, você pode usar o UnitOfWork, e ter uma única implementação dos repositório dentro dele, pesquise sobre essa metodologia eu uso aqui muito e é chic o negócio, evita de você ter que instanciar cada repositório que for usar.

O exemplo de inserção que você postou teria que estar dentro de uma transação, mas esquece, porque tenho certeza que não irá usar essa abordagem.

Abraços
LAMPIAO 24/08/2016 14:54:08
#466137
Só para complementar.

Na atualização pense o seguinte, o usuário apenas incluiu um novo telefone, ou alterou apenas um ou vários telefones, eu não preciso para isso atualizar todo o objeto pessoa, apenas o objeto telefone que pertence a uma pessoa.

Ah, parabéns, pelo tempo que você falou que começou, ta de parabéns pois você já esta dentro do conceito de como deve ser feito as coisas na programação moderna, basicamente agora é ir amadurecendo o seu código e sempre buscar implementações novas, o caminho é por ai mesmo, o resto é história.

Abraços
MICHAELL 24/08/2016 18:01:41
#466146
Lampiao, muito agradecimento pelo tempo dedicado em ajudar...

Citação:


Bom pra começar eu não uso interface e repositório genérico, sempre crio eles exatamente com o tipo de objeto que vou trabalhar, isso
é uma questão de gosto, mas é bem mais fácil trabalhar com algo especializado do que com algo genérico.



isso é algo que estava lendo agora pouco...no link abaixo o Cigano Morrison Mendez cita diversas motivos para não utilizar repositorios.

http://pt.stackoverflow.com/questions/51536/quando-usar-entity-framework-com-repository-pattern/80696#80696

Realmente, depois de analisar tudo que ele falou você ainda confirmou. Parece que eu estava indo pelo caminho mais longo rsrsrsrs

Lembro que no inicio dos meus estudos não conseguia de forma alguma salvar entidades tudo de uma vez, por isso implementei tudo separado.
O Autor do link fala sobre isso e comenta que isso é o Problema do Contexto Destacado devido ao uso de repositorios e contextos destintos.

Citação:


Use resources para colocar as mensagens de validação, isso facilita a manutenção e troca de idioma, tem muita anotação não suas classes,
se o seu foco for apenas windows forms beleza, caso contrário não vão servir pra muita coisa é codificação a toa, isso pode ficar na classe de validação.



Estou utilizando Annotations para fazer a validação...
porém, realmente as classes ficam mais poluídas, mas foi a maneira mais profissional que encontrei.

entao procurando melhor, encontrei no link abaixo sobre validações declarativas... mas basicamente é o mesmo que os annotations faz..
ou estou enganado?

http://pt.stackoverflow.com/questions/105670/quais-s%C3%A3o-as-boas-pr%C3%A1ticas-na-valida%C3%A7%C3%A3o-de-campos

muito obrigado mesmo pela ajuda.
Página 5 de 5 [46 registro(s)]
Tópico encerrado , respostas não são mais permitidas