如何跨网站用户共享实体框架模型

时间:2010-03-18 18:10:50

标签: asp.net-mvc entity-framework

目前,我的网站基于MVC和针对SQL Server 2005数据库运行的实体框架。到目前为止,它一直运行得非常顺利,我真的很喜欢MVC及其更简洁的代码(没有巨大的观察者或灵魂摧毁回发;))

最近我正在努力升级网站以使用简单的论坛系统,这就是我开始遇到问题的地方。当我使用两种不同的浏览器测试网站时,如果我在一个浏览器中创建或回复帖子,则其他浏览器无法看到帖子。

目前,该站点的每个访问者都获得了他们自己的实体模型副本,我将其存储在会话数据中。显然这是问题,因为对一个模型的更新不会被带到另一个模型。

作为测试,我尝试通过将模型分配给静态变量来存储模型的单个副本,所有访问者都可以访问该模型。这很有效,两个浏览器都可以看到彼此的修改。但是,它有副作用。例如,如果我同时启动两个浏览器并初始化模型,一个浏览器会崩溃,另一个浏览器会正常工作,尽管我使用了一个锁定对象,所以理论上其中一个应该被推迟到模型准备好了(当然我可以实现这个错误;))。此外,最初这个站点确实为所有访问者使用了一个模型,当它生效时,它经常关闭 - 杀死IIS应用程序池。现在我不确定这是否相关,但我真的不想重新引入任何导致此关闭的错误。

所以,我的问题实际上是一个简单的问题 - 对所有网站用户使用相同模型的最佳方式是什么,以便他们都看到更新,或者他们是否有单独的副本(我认为这会产生性能影响)及时)模型如何检测数据库中的变化并根据自己进行更新。

提前感谢任何建议!

的问候;
理查德莫斯

2 个答案:

答案 0 :(得分:1)

在每个请求中从数据库中获取所需数据。让web和/或ASP.Net缓存完成其工作,而不是将数据置于会话状态。

无论何时将新数据提交到数据库,都可以在超时或通过代码直接失效时执行缓存失效。

更多澄清:当我说“在每个请求上获取所需数据”时,它基于以下事实:从资源管理的角度来看,从数据库获取数据更具成本效益当你需要它时。在每个用户会话状态中存储论坛数据的副本将很快耗尽您的服务器内存(取决于用户数量和当然数据的大小)。此外,正如您自己经历的那样,尝试将这些副本与新更改保持同步变得非常困难。同样,只要您需要数据,就可以解决这些同步问题。

所以回答你的“最好的方式......”问题:根本不存储模型。 Datacontext和model应该只在一页请求所需的时间内存在。

现在,我提到了缓存,因为这可能就是您首先将数据置于会话状态的原因。 EF不进行缓存。我的建议是看the ASP.Net caching features。这是在页面和html级别进行缓存,这样可以提高资源效率。

答案 1 :(得分:1)

“网站的每个访问者都获得了他们自己的实体模型副本,我将其存储在会话数据中”

“当我使用两种不同的浏览器测试网站时,如果我在一个浏览器中创建或回复帖子,则其他浏览器无法看到帖子。”

等一下......

您是否将ObjectContext放入Session变量?这是一件非常奇怪的事情。您确定要将更改刷新到数据库吗?