Basic SaveChanges

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);
    context.SaveChanges();
}

Совет

Методы Addи Update методы работают на полном графе сущностей, переданных им, как описано в разделе "Связанные данные". Attach В качестве альтернативы свойство EntityEntry.State можно использовать для установки состояния только одной сущности. Например, context.Entry(blog).State = EntityState.Modified.

Обновление данных

EF автоматически обнаруживает изменения, внесенные в существующую сущность, отслеживаемую контекстом. Сюда входят сущности, которые вы загружаете или запрашиваете из базы данных, и сущности, которые ранее были добавлены и сохранены в базе данных.

Просто измените значения, назначенные свойствам, а затем вызовите 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();
}

Удаление данных

DbSet<TEntity>.Remove Используйте метод для удаления экземпляров классов сущностей:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Single(b => b.Url == "http://example.com/blog");
    context.Blogs.Remove(blog);
    context.SaveChanges();
}

Если сущность уже существует в базе данных, она будет удалена во время SaveChanges. Если сущность еще не сохранена в базе данных (то есть она отслеживается как добавленная), она будет удалена из контекста и больше не будет вставлена при SaveChanges вызове.

Несколько операций в одном методе SaveChanges

Можно объединить несколько операций add/Update/Remove в один вызов 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();
}

Примечание.

Для большинства поставщиков SaveChanges баз данных используется транзакционная операция. Это означает, что все операции либо успешно, либо завершаются сбоем, и операции никогда не остаются частично применены.