为什么这段代码末尾的两个测试会返回不同的结果?它们都查询相同的数据上下文,但一个返回'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
答案 0 :(得分:2)
你看到的行为是完全正常的,即使看起来很奇怪。虽然数据库中的值确实已更新为222,但您的对象中仍然存在一些陈旧数据。
致电时
context1.SaveChanges();
更改将持久保存到数据库(111)。
然后致电
context2.SaveChanges();
并且这些更改将持久保存到数据库(222)。
var mycams
基于现有对象(context1.Campaigns
),其值仍为111.执行查询但实体框架使用其实体的缓存值(感谢@GertArnold提出此要点)
context1.Campaigns.Where(...)
将从数据库中检索数据,而不是从缓存中检索数据,这就是为什么你会看到222。