Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
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 является транзакционной системой. Это означает, что все операции либо успешно завершаются, либо завершаются сбоем, и операции никогда не остаются частично применёнными.