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

Metodo SaveChanges()

Colocar o método SaveChanges() na linha após Adicionar ? ou separar extrair ele para Método sozinho ?

Imaginemos a classe PedidoDAO.cs e ItensPedidoDAO.cs ...

Se o metodo Savechanges() estiver dentro do metodo AdicionarPedido(), se por acaso der erro ao adicionar os itens do pedido, não vai ficar "lixo" dentro do sistema ?

Exemplo

public void AdicionarPedido(Pedido pedido)
{
 _contexto.Add(pedido);
_contexto.SaveChanges();
}

La no controller

public Create(Pedido pedido)
{
  var itens = lista_itens (exemplo)

    pedidoDAO.AdicionarPedido(pedido)

   pedidoitemDAO.AdicionarItens(itens);
  //se der erro nesta linha o método SaveChanges já gravou o pedido...
//Não seria melhor então extrair o método SaveChanges e deixar assim ?


   pedidoDAO.AdicionarPedido(pedido)
   pedidoitemDAO.AdicionarItens(itens);
   databaseDAO.SaveChanges();


}

Ou existe outra solução mias elegante ?

5 respostas

Olá Jose,

o problema da segunda solução é que você está vazando para o controller uma lógica de banco que é o databaseDAO.SaveChanges(). Fora que está vazando o encapsulamento pois agora o controller sabe que o comportamento interno dos daos precisa chamar o SaveChanges após um Add para o código rodar.

Se entendi sua dúvida, o problema é que você tem uma classe Pedido e dentro dela você tem uma propriedade de List<Item>. Para não ficar nenhuma sugeira, você só precisa chamar o pedidoDao.AdicionarPedido(pedido), pois se dentro do objeto pedido ele tiver a lista de itens, ele salva no banco os itens também. E caso de problema antes do SaveChanges, o entity faz o rollback de tudo e não fica nenhuma sugeira.

É isso... Mas ainda não entendi como ficaria o DAO do pedido.. E o controller dele.. Pode me exemplificar?

Eu adiciono o pedido e os não adicionaria os itens?

Oi, alguém do Alura pode responder ??

solução!

Olá Jose,

na sua classe Pedido você deve ter uma propriedade List<Item> ItensDoPedido{get;set;} para representar o relacionamento entre suas duas classes.

public class Pedido 
{
    public List<Item> ItensDoPedido{get;set;}
}

Você pode deixar o seu dao do jeito que me mandou antes:

public void AdicionarPedido(Pedido pedido)
{
 _contexto.Add(pedido);
_contexto.SaveChanges();
}

Que se na hora de salvar o pedido chamando pedidoDao.AdicionarPedido(pedido), o objeto do pedido tiver com a lista ItensDoPedido preenchida com alguns itens, o entity já salva o pedido e também os itens tudo junto. E se der algum erro no meio do caminho ele faz um rollback de tudo não deixando o banco com sujeira.

Entendi... obrigado