基础保存

学习如何使用上下文实例和实体类型添加、修改和删除数据。

提示

你可以在 GitHub 上查阅当前文章涉及的代码样例

添加数据

使用 DbSet.Add 方法可以添加实体类型的新实例,当你调用 SaveChanges 的时候,数据会被插入到数据库。

  1. using (var context = new BloggingContext())
  2. {
  3. var blog = new Blog { Url = "http://sample.com" };
  4. context.Blogs.Add(blog);
  5. context.SaveChanges();
  6. Console.WriteLine(blog.BlogId + ": " + blog.Url);
  7. }

更新数据

EF 会自动检测对上下文跟踪的已有实体的变更。这包括你从数据库加载/查询的实体,以及之前已添加和保存到数据库的实体。

对属性进行简单地指派以给它赋值,然后调用 SaveChanges

  1. using (var context = new BloggingContext())
  2. {
  3. var blog = context.Blogs.First();
  4. blog.Url = "http://sample.com/blog";
  5. context.SaveChanges();
  6. }

删除数据

使用 DbSet.Remove 方法可以删除实体类型实例。

如果实体已存在于数据中,则会在 SaveChanges 期间被删除。如果实体还没被保存到数据库(也就是作为新增项被跟踪),那么将从上下文中移除它,调用 SaveChanges 时就不会再将其插入到数据库。

  1. using (var context = new BloggingContext())
  2. {
  3. var blog = context.Blogs.First();
  4. context.Blogs.Remove(blog);
  5. context.SaveChanges();
  6. }

SaveChanges 中的多操作

可以在单次 SaveChanges 调用中组合使用 Add / Update / Remove 操作。

注意

对于大部分数据库提供程序,SaveChanges 是事务性的。这意味着所有操作不是全部成功就是全部失败,不会部分有效。

  1. using (var context = new BloggingContext())
  2. {
  3. // seeding database
  4. context.Blogs.Add(new Blog { Url = "http://sample.com/blog" });
  5. context.Blogs.Add(new Blog { Url = "http://sample.com/another_blog" });
  6. context.SaveChanges();
  7. }
  8. using (var context = new BloggingContext())
  9. {
  10. // add
  11. context.Blogs.Add(new Blog { Url = "http://sample.com/blog_one" });
  12. context.Blogs.Add(new Blog { Url = "http://sample.com/blog_two" });
  13. // update
  14. var firstBlog = context.Blogs.First();
  15. firstBlog.Url = "";
  16. // remove
  17. var lastBlog = context.Blogs.Last();
  18. context.Blogs.Remove(lastBlog);
  19. context.SaveChanges();
  20. }