Entity Framework是否具有某种上下文缓存?

3
我们有两个Web应用程序,每个应用程序都为EF创建自己的数据上下文。当我在一个应用程序中更改实体时,我可以在页面和SQL Server Management Studio中查看数据时看到更改。但是,在另一个应用程序中我不会立即看到更改。
两个应用程序都使用依赖注入,并且两个应用程序都使用相同的业务层和数据层。因此,两个应用程序中的UI都通过一个公共控制器类(不要与MVC控制器混淆),控制器通过检索实体的存储库。因为它们是不同的应用程序,所以它们各自拥有自己的实体框架数据上下文实例。
如果存在某种缓存,我该如何关闭它?
提前感谢您。
编辑-也许缓存发生在EF之上?清除浏览器缓存似乎无法解决问题。经过一段时间,我会突然在另一个应用程序中看到记录的更新,但是一段时间内无论刷新多少次都看不到更新。

如果缓存发生在上下文中,当您在当前HTTP请求结束时处理上下文时,缓存的值应该会被清除。您有每个请求的上下文,对吧? - Joel Mueller
1
嗯,我想你让我意识到了问题。你能把它发表为答案吗? - Chev
2个回答

7
如果缓存发生在上下文中,当您在当前HTTP请求结束时处置上下文时,缓存的值应该消失。您是否拥有每个请求的上下文呢?
以下是一些上下文生命周期最佳实践

1
“kernel.Bind<IVendorBriefRepository>().To<VendorBriefRepository>().InSingletoneScope();”是罪魁祸首。Ninject只创建了一个基础存储库的实例,并在尽可能长的时间内使用同一实例。存储库是创建EF数据上下文实例的对象。“kernel.Bind<IVendorBriefRepository>().To<VendorBriefRepository>().InRequestScope();”解决了这个问题。谢谢! - Chev
我遇到了一个有趣的问题 - 当你仔细思考时它是有道理的,但对我来说却是个陷阱。我的存储库层使用了InRequestScope,但我的服务层没有(默认为InSingletonScope),因此存储库一直留在内存中而不刷新上下文。 - Peter Munnings

2
是的,上下文会缓存它们的结果。
您应该在每个查询中创建一个新的上下文(或者实现类似于NHibernate的“每个请求的会话”Session-per-request)。

我创建了一个Web应用程序,为每个查询创建了一个新的上下文,但是在每次创建后上下文并不为空,请参考我的问题http://stackoverflow.com/questions/5977585/an-object-with-the-same-key-already-exists-with-a-newly-created-context,你有什么看法? - remi bourgarel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接