基本 SaveChanges 操作 - EF Core

分类: mobile365官方网站立即加入 2025-09-27 03:04:47 作者: admin

DbContext.SaveChanges() 是使用 EF 保存数据库更改的两种技术之一。 使用此方法,您可以执行一个或多个跟踪的更改(添加、更新、删除),然后通过调用SaveChanges方法应用这些更改。 作为替代方法,可以在不涉及更改跟踪器的情况下使用ExecuteUpdate和ExecuteDelete。 有关这两种方法的介绍性比较,请参阅有关保存数据的概述页。

小窍门

可以在 GitHub 上查看本文 的示例 。

添加数据

使用该方法 DbSet.Add 添加新的实体类实例。 当您调用 DbContext.SaveChanges() 时,数据将被插入到数据库中。

using (var context = new BloggingContext())

{

var blog = new Blog { Url = "http://example.com" };

context.Blogs.Add(blog);

await context.SaveChangesAsync();

}

小窍门

Add和AttachUpdate方法都处理传递给它们的实体的完整图,如“相关数据”部分所述。 或者,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.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 是事务性的。 这意味着所有操作要么成功要么失败,并且操作不会部分应用。