我一直在使用实体框架和SQL Server 3.5开发一些单用户桌面应用程序。我以为我曾经在某处读过一次记录在EF缓存中的一个上下文,如果使用不同的上下文删除它们,即使执行新的查询,也不会从第一个上下文的缓存中删除它们。因此,我一直在编写非常低效且令人迷惑的代码,所以无论何时其他方法使用自己的上下文修改数据库,我都可以处理上下文并实例化一个新上下文。EF缓存对SQL Server CE 3.5的工作方式不同吗?
我最近发现了一些代码,我没有在这些条件下重新实例化第一个上下文,但它仍然有效。我写了一个简单的测试方法,看看发生了什么事情:
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 服务器不同。
我怀疑答案可能是最后两个选项之一。如果我不这样做,我真的宁愿不必处理所有的麻烦,为单用户桌面应用程序不断重新实例化上下文。
我可以依赖这种为使用SQL CE(3.5和4)的单用户桌面应用程序发现的行为吗?
马克在他的问题分析(请参阅我的答案)基本上是正确的。将我的项目转换为DbContext在我的议程上。回覆。第一条评论:当然,对于ASP.Net,Silverlight或Metro应用程序以及访问远程/分离数据库的应用程序,上下文应该是暂时的。但作为一个老FoxPro程序员,我发现它不得不处理编辑分离的实体或复制的数据,然后将数据保存回数据库,以便使用本地连接的数据库进行适度的单用户桌面应用程序。在这种情况下,对象数据模型的功能和清晰度会被不必要的复杂代码所稀释。 – 2012-08-08 11:16:06