2012-05-17 44 views
2

我想知道如何在EF4.x或EF5中使用SQL Service Broker?使用SQL Service Broker的实体框架

场景: 说,我有一个产品列表,我不希望每次客户访问该页面时从db加载。当然,我可以缓存页面,但是如果产品经理添加了新产品,它不会立即显示,除非缓存已过期或查询参数已更改。

解决方案: 在SQL中,我们可以在Enable_Broker和Web应用程序中启动SqlDependency连接。 SQL将向我们的Web应用程序发送通知。因此,我们有一个聪明的'缓存'系统。 如果我们可以使用该智能缓存,这将是有意义的。当有1,000个客户单击该页面时,我们不需要访问SQL db 1000次。但是,一旦数据库发生变化,当时访问该页面的第一位客户将看到反思。我们得到两全其美。

问题: 实体框架未公开此能力。或者我不知道它?由于SQL 2005和ASP.NET 2.0已经具备了这种能力。 EF 4/5不能错过这个重要的功能,对吧?我需要一些专家来帮助我解决这个问题。

我偶然发现此链接黑客攻击:

http://www.codeproject.com/Articles/233770/AutoRefresh-Entity-Framework-data-using-SQL-Server

然而,这是或多或少的“无证神奇”的方式,它有一些未知的限制(限制链接从该页面有被删除,所以我不知道他们是什么)。所以,我使用它并不够可靠,如果在新的EF补丁后突然不起作用,我不会感到惊讶。有更多'官方'的方式来做到这一点吗?谢谢!

回答

1

请参阅LinqToCache,它可以通过SqlDependency缓存任意LINQ查询。说到EF,它是否由EF创建的SQL查询符合查询通知的限制。上次我检查了EF是无故地在请求中添加一个子查询,从而使查询不可通知。我听说最新的EF更好,它可能工作,但我没有自己测试。

1

.Net提供了在需要时使缓存失效的方法,您可以设置产品管理器在更新时使缓存失效的更新页面。可能比设立服务中介更容易

+0

你的意思是页缓存的时间和参数?如果这就是你的意思,我已经在第一段中提到了它。这是一个.net 1.0的东西。我想从代理服务的智能更新通知,就像我可以使用普通的sql db + .net 2.0 web应用程序... – Tom

+1

我的意思是说,当您的更新页面被使用时,您可以使页面缓存无效。这就是缓存通常的工作原理。您不必等待N秒后无效缓存。 – bwbrowning

+1

嗯。产品经理很可能通过ssis或类似的东西将数据传输到sql db。他可能不会使用网络应用来更新数千种产品的价格。在这种情况下,Web应用程序不知道在SQL DB上发生了什么。另外,我们可能有多个应用程序访问数据库... – Tom