我一直在使用 Entity Framework 和 SQL Server 3.5 开发一些单用户桌面应用程序。我以为我在某处读过,一旦记录在一个上下文的 EF 缓存中,如果使用不同的上下文删除它们,即使执行新查询,它们也不会从第一个上下文的缓存中删除。因此,我一直在编写非常低效且令人困惑的代码,因此每当另一种方法使用其自己的上下文修改数据库时,我就可以处理上下文并实例化一个新的。
我最近发现了一些代码,我没有在这些条件下重新实例化第一个上下文,但它仍然有效。我写了一个简单的测试方法来看看发生了什么:
using (UnitsDefinitionEntities context1 = new UnitsDefinitionEntities())
{
List<RealmDef> rdl1 = (from RealmDef rd in context1.RealmDefs
select rd).ToList();
RealmDef rd1 = RealmDef.CreateRealmDef(100, "TestRealm1", MeasurementSystem.Unknown, 0);
context1.RealmDefs.AddObject(rd1);
context1.SaveChanges();
int rd1ID = rd1.RealmID;
using (UnitsDefinitionEntities context2
= new UnitsDefinitionEntities())
{
RealmDef rd2 = (from RealmDef r in context2.RealmDefs
where r.RealmID == rd1ID select r).Single();
context2.RealmDefs.DeleteObject(rd2);
context2.SaveChanges();
rd2 = null;
}
rdl1 = (from RealmDef rd in context1.RealmDefs select rd).ToList();
在最后一行设置断点我惊讶地发现添加和删除的实体实际上并没有被第一个上下文的第二个查询返回!
我有几种可能的解释:
- 我完全错误地理解,缓存记录在重新查询时不会被删除。
- EF 在缓存方面反复无常,这是一个运气问题。
- EF 4.1 中的缓存已更改。
- 当两个上下文在同一进程中实例化时,不会出现此问题。
- SQL CE 3.5 的缓存工作方式与其他版本的 SQL Server 不同。
我怀疑答案可能是最后两个选项之一。如果我不必这样做,我真的宁愿不必处理不断为单用户桌面应用程序重新实例化上下文的所有麻烦。
对于使用 SQL CE(3.5 和 4)的单用户桌面应用程序,我可以依赖这种发现的行为吗?