Não coloquei o método savechanges, mesmo assim persistiu no banco de dados. Por que isso aconteceu ? é implícito ?
Não coloquei o método savechanges, mesmo assim persistiu no banco de dados. Por que isso aconteceu ? é implícito ?
Olá Jose,
mesmo se você não chamar o SaveChanges()
, o Entity acaba persistindo no banco as entidades no final da execução. Mas tem uma diferença de comportamento interno entre chamar ou não o SaveChanges, que é o que conhecemos por conrole de transação. Vamos supor que você tem o seguinte código:
static void Main(string[] args)
{
EntidadesContext contexto = new EntidadesContext();
Usuario renan = new Usuario()
{
Nome = "Renan",
Senha = "123"
};
contexto.Usuarios.Add(renan);
contexto.SaveChanges();
Usuario jose = new Usuario()
{
Nome = "Jose",
Senha = "345"
};
contexto.Usuarios.Add(jose);
contexto.SaveChanges();
context.Dispose();
}
Quando chamamos o método contexto.Usuarios.Add(renan)
, ele ainda não foi enviado para o banco. O Entity apenas guardou esta entidade dentro do seu contexto na lista de ações pendentes que ele precisa fazer. Dando o SaveChanges
ele olha todas as alterações pendentes a serem feitas no banco de dados, como cadastrar o renan, e as executa no banco.
Da mesma forma, quando ele faz contexto.Usuarios.Add(jose)
agora o jose fica nas pendências que ele precisa resolver no banco e após o SaveChanges
o jose é persistido.
Porém vamos supor que na hora de fazer um SaveChanges do jose ocorra algum problema/exception. Por dar um erro, Entity fará o processo conhecido por rollback, ou seja, ele volta o banco para o último estado estável. No caso o estado anterior estável que ele tinha antes era com o renan cadastrado no banco. Então apenas o jose não será cadastrado no banco.
Agora se você fizer este código:
static void Main(string[] args)
{
EntidadesContext contexto = new EntidadesContext();
Usuario renan = new Usuario()
{
Nome = "Renan",
Senha = "123"
};
contexto.Usuarios.Add(renan);
Usuario jose = new Usuario()
{
Nome = "Jose",
Senha = "345"
};
contexto.Usuarios.Add(jose);
context.Dispose();
}
Tanto o renan quanto o jose ficarão pendentes de serem salvos no banco. Apenas quando o contexto estiver sendo fechado que o Entity resolverá estas dependências. Só que agora, se ocorrer alguma exception durante o processo, o rollback excluirá tanto o renan quanto o jose.