背景
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 語句,如何模擬這種語義呢?
還沒有想到方法,朋友們給點意見。
備注
今天為問題而來。
