SaveChanges básicos
DbContext.SaveChanges() é uma das duas técnicas para salvar alterações no banco de dados com o EF. Com esse método, você executa uma ou mais alterações controladas (adicionar, atualizar, excluir) e, em seguida, aplica essas alterações chamando o método SaveChanges
. Como alternativa, ExecuteUpdate e ExecuteDelete podem ser usados sem envolver o rastreador de alterações. Para obter uma comparação introdutória dessas duas técnicas, consulte a página de Visão geral sobre como salvar dados.
Dica
Veja o exemplo deste artigo no GitHub.
Adicionando dados
Use o método DbSet<TEntity>.Add para adicionar novas instâncias de suas classes de entidade. Os dados serão inseridos no banco de dados quando você chamar DbContext.SaveChanges():
using (var context = new BloggingContext())
{
var blog = new Blog { Url = "http://example.com" };
context.Blogs.Add(blog);
context.SaveChanges();
}
Dica
Os métodos Add
, Attach
e Update
funcionam no grafo completo de entidades aprovadas para eles, conforme descrito na seção Dados Relacionados. Como alternativa, a propriedade EntityEntry.State pode ser usada para definir o estado de uma única entidade. Por exemplo, context.Entry(blog).State = EntityState.Modified
.
Atualizando dados
O EF detectará automaticamente as alterações feitas em uma entidade existente que é controlada pelo contexto. Isso inclui as entidades que você carrega/consulta do banco de dados e as entidades que foram anteriormente adicionadas e salvas no banco de dados.
Basta modificar os valores atribuídos às propriedades e chamar SaveChanges
:
using (var context = new BloggingContext())
{
var blog = context.Blogs.Single(b => b.Url == "http://example.com");
blog.Url = "http://example.com/blog";
context.SaveChanges();
}
Excluindo dados
Use o método DbSet<TEntity>.Remove para excluir instâncias das suas classes de entidade:
using (var context = new BloggingContext())
{
var blog = context.Blogs.Single(b => b.Url == "http://example.com/blog");
context.Blogs.Remove(blog);
context.SaveChanges();
}
Se a entidade já existir no banco de dados, ela será excluída durante SaveChanges
. Se a entidade ainda não tiver sido salva no banco de dados (ou seja, se ela for rastreada como adicionada), ela será removida do contexto e não será mais inserida quando SaveChanges
for chamado.
Várias operações em um único SaveChanges
Você pode combinar várias operações Adicionar/Carregar/Remover em uma única chamada para SaveChanges
:
using (var context = new BloggingContext())
{
// seeding database
context.Blogs.Add(new Blog { Url = "http://example.com/blog" });
context.Blogs.Add(new Blog { Url = "http://example.com/another_blog" });
context.SaveChanges();
}
using (var context = new BloggingContext())
{
// add
context.Blogs.Add(new Blog { Url = "http://example.com/blog_one" });
context.Blogs.Add(new Blog { Url = "http://example.com/blog_two" });
// update
var firstBlog = context.Blogs.First();
firstBlog.Url = "";
// remove
var lastBlog = context.Blogs.OrderBy(e => e.BlogId).Last();
context.Blogs.Remove(lastBlog);
context.SaveChanges();
}
Observação
Para a maioria dos provedores de banco de dados, SaveChanges
é transacional. Isso significa que todas as operações serão bem-sucedidas ou falharão e as operações nunca ficarão parcialmente aplicadas.