一. 基本数据
每个 EF 上下文实例都有一个 ChangeTracker(更改跟踪器), 它负责跟踪需要写入数据库的更改. 当更改实体类的实例时 (修改属性, 删除实例, 新建实例等), 这些更改会记录在 ChangeTracker 中, 然后在调用 SaveChanges 时被写入数据库. 此数据库提供程序负责将更改, 转换为特定的数据库操作 (例如, 关系数据库的 INSERT,UPDATE 和 DELETE 命令).
1.1 添加数据
使用 DbSet.Add 方法添加实体类的新实例. 调用 SaveChanges 时, 数据将插入到数据库中.
- var blog = new Blog { Url = "http://sample.com" };
- context.Blogs.Add(blog);
- context.SaveChanges();
1.2 更新数据
EF 将通过 ChangeTracker 自动检测上下文对现有实体所做的更改. 检测包括从数据库查询的实体, 以及之前添加并保存到数据库的实体. 例如下面示例, 从数据库查询的实体, 只需通过赋值来修改属性, 然后调用 SaveChanges 即可
- var blog = context.Blogs.First();
- blog.Url = "http://sample.com/blog";
- context.SaveChanges();
1.3 删除数据
使用 DbSet.Remove 方法删除实体类的实例.
(1) 如果实体已存在于数据库中, 则将在 "SaveChanges" 期间删除该实体, 并且删除数据库中的数据.
(2) 如果实体尚未保存到数据库 (即跟踪为 "已添加"), 则在调用 SaveChanges 时, 该实体会从上下文中移除且不再插入.
- // 第一种情况
- var blog = context.Blogs.First();
- context.Blogs.Remove(blog);
- context.SaveChanges();
- // 第二种情况
- Blog blog = new Blog() { Url = "www.baidu.com" };
- // 添加后该实体为已添加, 尚未保存到数据库
- BloggingContext.Blogs.Add(blog);
- // 删除实体类的实例
- BloggingContext.Blogs.Remove(blog);
- // 从上下文中移除 blog 实体
- BloggingContext.SaveChanges();
1.4 单个 SaveChanges 中的多个操作
可以将多个添加 / 更新 / 删除操作合并到对 "SaveChanges" 的单个调用.
- // add
- context.Blogs.Add(new Blog { Url = "http://sample.com/blog_one" });
- context.Blogs.Add(new Blog { Url = "http://sample.com/blog_two" });
- // update
- var firstBlog = context.Blogs.First();
- firstBlog.Url = "";
- // remove
- var lastBlog = context.Blogs.Last();
- context.Blogs.Remove(lastBlog);
- context.SaveChanges();
二. 关联数据
除了上面对独立实体进行保存外, 还可以保存模型中定义的关系 (主体实体和依赖实体)
1.1 添加关系数据
- var blog = new Blog
- {
- Url = "http://blogs.msdn.com/dotnet",
- Posts = new List<Post>
- {
- new Post { Title = "Intro to C#" },
- new Post { Title = "Intro to VB.NET" },
- new Post { Title = "Intro to F#" }
- }
- };
- context.Blogs.Add(blog);
- context.SaveChanges();
- var blog = context.Blogs.Include(b => b.Posts).First();
- var post = new Post { Title = "Intro to EF Core" };
- // 引用新实体,
- blog.Posts.Add(post);
- context.SaveChanges();
- // 新增一个主体实体
- var blog = new Blog { Url = "http://blogs.msdn.com/visualstudio" };
- var post = context.Posts.First();
- //post 更新关系
- post.Blog = blog;
- context.SaveChanges();
- var blog = context.Blogs.Include(b => b.Posts).First();
- var post = blog.Posts.First();
- // 删除一条 post 依赖实体
- blog.Posts.Remove(post);
- context.SaveChanges();
- var blog = context.Blogs.Include(b => b.Posts).First();
- var posts = blog.Posts.ToList();
- context.Remove(blog);
- context.SaveChanges();
- DELETE FROM [Posts] WHERE [PostId] = 1
- DELETE FROM [Posts] WHERE [PostId] = 2
- DELETE FROM [Blogs] WHERE [BlogId] = 1
- CREATE UNIQUE INDEX IX_Url ON Blogs(Url)
- // 修改数据
- var blog = BloggingContext.Blogs.First();
- blog.Title = "123";
- // 插入数据, 再次插入违反约束
- BloggingContext.Blogs.Add(new Blog() { Url = "www.baidu.com" });
- BloggingContext.SaveChanges();
- using (var transaction = context.Database.BeginTransaction())
- {
- try
- {
- context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
- context.SaveChanges();
- context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });
- context.SaveChanges();
- var blogs = context.Blogs
- .OrderBy(b => b.Url)
- .ToList();
- // Commit transaction if all commands succeed, transaction will auto-rollback when disposed if either commands fails
- transaction.Commit();
- }
- catch (Exception)
- {
- // TODO: Handle failure
- }
- }
- public class BloggingContext : DbContext
- {
- private DbConnection _connection;
- public BloggingContext(DbConnection connection)
- {
- _connection = connection;
- }
- public DbSet<Blog> Blogs { get; set; }
- protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
- {
- optionsBuilder.UseSqlServer(_connection);
- }
- }
- // 创建共享连接
- var options = new DbContextOptionsBuilder<BloggingContext>()
- .UseSqlServer(new SqlConnection(connectionString))
- .Options;
- using (var context1 = new BloggingContext(options))
- {
- using (var transaction = context1.Database.BeginTransaction())
- {
- try
- {
- context1.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
- context1.SaveChanges();
- using (var context2 = new BloggingContext(options))
- {
- context2.Database.UseTransaction(transaction.GetDbTransaction());
- var blogs = context2.Blogs
- .OrderBy(b => b.Url)
- .ToList();
- }
- // Commit transaction if all commands succeed, transaction will auto-rollback when disposed if either commands fails
- transaction.Commit();
- }
- catch (Exception)
- {
- // TODO: Handle failure
- }
- }
- }
来源: https://www.cnblogs.com/MrHSR/p/10448663.html