查询相同数据上下文时的结果不同

时间:2018-02-16 12:59:36

标签: c# entity-framework

为什么这段代码末尾的两个测试会返回不同的结果?它们都查询相同的数据上下文,但一个返回'111'而另一个'222'?

//Make two contexts
myAppContext context1 = new myAppContext();
myAppContext context2 = new myAppContext();

// Select and Modify Campaign id 1 using context 1
var SingleCam = context1.Campaigns.Where(c => c.CamId == 1).Single();
SingleCam.CamApplications = 111;
context1.Entry(SingleCam).State = System.Data.Entity.EntityState.Modified;
context1.SaveChanges();

// Select and Modify Campaign id 1 again using context 2
var SingleCam2 = context2.Campaigns.Where(c => c.CamId == 1).Single();
SingleCam2.CamApplications = 222;
context2.Entry(SingleCam2).State = System.Data.Entity.EntityState.Modified;
context2.SaveChanges();

// Access the Campaign through the same Context (1) and get two differnt results
var mycams = context1.Campaigns.ToList();
System.Diagnostics.Debug.WriteLine("Test 1 = " + mycams.Where(o => o.CamId == 1).Select(o => o.CamApplications).FirstOrDefault()); //returns 111
System.Diagnostics.Debug.WriteLine("Test 2 = " + context1.Campaigns.Where(o => o.CamId == 1).Select(o => o.CamApplications).FirstOrDefault()); //returns 222

1 个答案:

答案 0 :(得分:2)

你看到的行为是完全正常的,即使看起来很奇怪。虽然数据库中的值确实已更新为222,但您的对象中仍然存在一些陈旧数据。

致电时

context1.SaveChanges();

更改将持久保存到数据库(111)。

然后致电

context2.SaveChanges();

并且这些更改将持久保存到数据库(222)。

var mycams

基于现有对象(context1.Campaigns),其值仍为111.执行查询但实体框架使用其实体的缓存值(感谢@GertArnold提出此要点)

context1.Campaigns.Where(...)

将从数据库中检索数据,而不是从缓存中检索数据,这就是为什么你会看到222。