缓存实体框架数据并跟踪其更改

本文关键字:跟踪 实体 框架 数据 缓存 | 更新日期: 2023-09-27 18:27:00

我想要的在概念上非常简单,但我不知道如何最好地实现这样的东西。

在我的web应用程序中,我有访问存储库的服务,这些存储库访问与SQL Server数据库交互的EF。所有这些都会在每个web请求中实例化一次。

我想在存储库和EF(或者服务和存储库?)之间有一个额外的层,它静态地跟踪从数据库中提取和推送到数据库中的对象。

假设数据库访问仅通过应用程序完成,我们的目标是知道,除非某个存储库访问EF并提交更改,否则对象集并没有真正更改。

一个例子是:

存储库调用方法GetAllCarrots();

GetAllCarrots()在检索List<Carrot>的SQL Server上执行查询,如果其间没有发生任何其他事情,我希望每次都不要在SQL Server上进行此查询(无论是在不同的web请求上,我都希望能够处理该场景)

现在,如果对BuyCarrot()的调用将Carrot添加到表中,那么我希望它使Carrots的静态缓存无效,这将使GetAllCarrots();需要再次查询数据库。

关于数据库缓存,有哪些好的资源?

缓存实体框架数据并跟踪其更改

您可以为此使用LinqToCache。

它允许您在存储库中使用以下代码:

var queryTags = from t in ctx.Tags select t;
var tags = queryTags.AsCached("Tags");
foreach (Tag t in tags)
{
  ...
}

其思想是使用SqlDependency在查询结果更改时得到通知。只要结果不变,你就可以缓存它。

LinqToCache跟踪您的查询,并在查询时返回缓存的数据。当从SqlServer接收到通知时,缓存将重置。

我建议您阅读http://rusanu.com/2010/08/04/sqldependency-based-caching-of-linq-queries/。

我遇到了类似的挑战,由于EF的使用和限制,我决定使用IoC将缓存作为客户端和服务器服务之间的附加服务来实现。监视可能影响缓存数据的所有服务方法。

如果目标是支持我将使用SqlDependency实现的多个服务器,那么当您有一个服务器场运行服务时,Off-scourse并不是一个完美的解决方案。