Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
DbContext.SaveChanges() — один из двух способов сохранения изменений в базе данных с помощью EF. С помощью этого метода выполняется одно или несколько отслеживаемых изменений (добавление, обновление, удаление), а затем применение этих изменений путем вызова SaveChanges метода. В качестве альтернативы можно использовать ExecuteUpdate и ExecuteDelete без участия средства отслеживания изменений. Вводное сравнение этих двух методов см. на странице "Обзор" для сохранения данных.
Подсказка
Вы можете скачать используемый в этой статье пример из репозитория GitHub.
Добавление данных
DbSet<TEntity>.Add Используйте метод для добавления новых экземпляров классов сущностей. Данные будут вставлены в базу данных при вызове DbContext.SaveChanges():
using (var context = new BloggingContext())
{
var blog = new Blog { Url = "http://example.com" };
context.Blogs.Add(blog);
await context.SaveChangesAsync();
}
Подсказка
Методы Add, Attach и Update работают на полном графе сущностей, переданных им, как описано в разделе Связанные данные. Кроме того, свойство EntityEntry.State можно использовать для задания состояния только одной сущности. Например: context.Entry(blog).State = EntityState.Modified.
Обновление данных
EF автоматически обнаруживает изменения, внесенные в существующую сущность, отслеживаемую контекстом. К ним относятся сущности, которые загружаются и запрашиваются из базы данных, а также сущности, которые ранее были добавлены и сохранены в базе данных.
Просто измените значения, назначенные свойствам, а затем вызовите SaveChanges:
using (var context = new BloggingContext())
{
var blog = await context.Blogs.SingleAsync(b => b.Url == "http://example.com");
blog.Url = "http://example.com/blog";
await context.SaveChangesAsync();
}
Удаление данных
DbSet<TEntity>.Remove Используйте метод для удаления экземпляров классов сущностей:
using (var context = new BloggingContext())
{
var blog = await context.Blogs.SingleAsync(b => b.Url == "http://example.com/blog");
context.Blogs.Remove(blog);
await context.SaveChangesAsync();
}
Если сущность уже существует в базе данных, она будет удалена во время SaveChanges. Если сущность еще не сохранена в базе данных (то есть она отслеживается как добавленная), она будет удалена из контекста и больше не будет вставлена при SaveChanges вызове.
Несколько операций при единичном вызове SaveChanges
Можно объединить несколько операций Добавить/Обновить/Удалить в один вызов 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" });
await context.SaveChangesAsync();
}
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 = await context.Blogs.FirstAsync();
firstBlog.Url = "";
// remove
var lastBlog = await context.Blogs.OrderBy(e => e.BlogId).LastAsync();
context.Blogs.Remove(lastBlog);
await context.SaveChangesAsync();
}
Замечание
Для большинства поставщиков баз данных SaveChanges является транзакционной системой. Это означает, что все операции либо успешно завершаются, либо завершаются сбоем, и операции никогда не остаются частично применёнными.