背景
EntityFramework 中 DbSet.Add 方法不会导致立即执行 insert 语句,这在长事务中非常有用,不过多数用例都是短事务的,为何我需要一个立即执行 insert 语句的方法呢?本文就是在思考这个问题。
先看一个代码
代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using EntityFrameworkStudy.Studys; 8 9 namespace EntityFrameworkStudy 10 { 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 using (var context = new StudyContext()) 16 { 17 context.Database.ExecuteSqlCommand("DELETE FROM Articles WHERE Title = '鸭梨'"); 18 19 AddNotExistArticle(context); 20 AddNotExistArticle(context); 21 22 context.SaveChanges(); 23 24 Console.WriteLine(context.Articles.Where(x => x.Title == "鸭梨").Count()); 25 } 26 } 27 28 private static void AddNotExistArticle(StudyContext context) 29 { 30 var order = context.Articles.FirstOrDefault(x => x.Title == "鸭梨"); 31 if (order == null) 32 { 33 context.Articles.Add(new Article() { Title = "鸭梨" }); 34 } 35 } 36 } 37 }
输出结果为 2,而我原本期望的结果是 1。
正常的思考思路是:我已经 Add 了,再用 FirstOrDefault 查询就应该能获取到,这在一个真实的项目场景中(调用栈不是这么简单、涉及批量操作),这种 Bug 非常容易形成。
如何模拟 Session.Save 的语义
NHibernate 中的 Session.Save 会立即执行 insert 语句,如何模拟这种语义呢?
还没有想到方法,朋友们给点意见。
备注
今天为问题而来。