Com o Entity Framework, a maior parte do tempo SaveChanges()
é suficiente. Isso cria uma transação ou inscreve-se em qualquer transação ambiental e faz todo o trabalho necessário nessa transação.
Às vezes, embora o SaveChanges(false) + AcceptAllChanges()
emparelhamento seja útil.
O local mais útil para isso é em situações nas quais você deseja fazer uma transação distribuída em dois contextos diferentes.
Ou seja, algo assim (ruim):
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save and discard changes
context1.SaveChanges();
//Save and discard changes
context2.SaveChanges();
//if we get here things are looking good.
scope.Complete();
}
Se context1.SaveChanges()
for bem-sucedido, mas context2.SaveChanges()
falhar, toda a transação distribuída é abortada. Infelizmente, porém, o Entity Framework já descartou as alterações context1
, portanto você não pode reproduzir ou registrar efetivamente a falha.
Mas se você alterar seu código para ficar assim:
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save Changes but don't discard yet
context1.SaveChanges(false);
//Save Changes but don't discard yet
context2.SaveChanges(false);
//if we get here things are looking good.
scope.Complete();
context1.AcceptAllChanges();
context2.AcceptAllChanges();
}
Enquanto a chamada SaveChanges(false)
envia os comandos necessários para o banco de dados, o contexto em si não é alterado; portanto, você pode fazê-lo novamente, se necessário, ou pode interrogar oObjectStateManager
que desejar.
Isso significa que, se a transação realmente lançar uma exceção, você poderá compensar, tentando novamente ou registrando o estado de cada contexto ObjectStateManager
algum lugar.
Veja meu blog para mais.
SaveChanges(fase); ... AcceptAllChanges();
havia um padrão em primeiro lugar. Observe como a resposta aceita para a pergunta acima é escrita pelo autor de um blog - e esse blog é referenciado na outra pergunta. Tudo vem junto.