2011-04-14 53 views
3

我们有两个Web应用程序,每个应用程序都为EF创建它自己的数据上下文。当我在一个应用程序中对实体进行更改时,当我在SQL Server Mangement Studio中查看数据时,可以看到页面和数据库中的更改。但是,我不会立即看到其他应用程序中的更改。实体框架是否有某种上下文缓存?

这两个应用程序都使用依赖注入,并且这两个应用程序都使用相同的业务层和数据层。因此,这两个应用程序中的用户界面都通过一个公共控制器类(不要与MVC控制器混淆),并且控制器通过它正在检索的实体的存储库。因为它们是不同的应用程序,它们都有自己的实体框架数据上下文实例。

如果存在某种缓存,我该如何关闭该缓存?

在此先感谢。

编辑 - 也许高速缓存在EF以上某处出现?清除我的浏览器缓存似乎不能解决问题。经过一段时间之后,我会突然看到其他应用程序中的记录更新,但一段时间没有任何提示会显示更新。

+0

如果高速缓存发生在上下文中,那么当您在当前HTTP请求结束时处理上下文时,高速缓存的值应该消失。你有一个每个请求的上下文,对吧? – 2011-04-14 21:15:58

+1

嗯。我想你只是让我意识到这个问题。你会把它作为答案吗? – Chev 2011-04-14 21:17:34

回答

7

如果缓存的背景下发生的,缓存值应该消失,当你在最后处置方面的当前的HTTP请求。你有一个每个请求的上下文,对吧?

这是context lifetime best practices

+1

'kernel.Bind ()。().InSingletoneScope();'是罪魁祸首。 Ninject只创建底层存储库的一个实例,并尽可能长时间使用同一个实例。该存储库是创建EF的数据上下文的实例。 kernel.Bind ()。()。InRequestScope();'修复了这个问题。谢谢! – Chev 2011-04-14 21:20:42

+0

很高兴听到它! – 2011-04-14 21:21:54

+0

我有一个有趣的 - 当你想通了,这是有道理的,但对我来说是一个陷阱。我的存储库层使用InRequestScope,但我的服务层不是(默认为InSingletonScope),所以存储库留在内存中而不刷新上下文。 – 2013-06-06 20:21:56

2

是的,上下文缓存他们的结果。

你应该创建与每个查询新的上下文(或执行类似NHibernate的Session-per-request

+0

我做了一个web应用程序为每个查询创建一个新的上下文,但每次创建后上下文都不是空的,请参阅我的问题http://stackoverflow.com/questions/5977585/an-object-with-the-same-key-已经存在与新创建的上下文有什么关系? – 2011-05-12 12:05:12