EntityFramework:我想我需要和 Session.Save 语义一样的方法

背景

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 语句,如何模拟这种语义呢?

还没有想到方法,朋友们给点意见。

备注

今天为问题而来。

 

posted on 2013-10-11 09:19  幸福框架  阅读(1364)  评论(13编辑  收藏  举报

导航

我要啦免费统计