缓存实体框架数据并跟踪其变化?

bev*_*qua 5 c# sql caching entity-framework

我想要的是概念上非常简单,但我无法弄清楚如何最好地实现这样的事情.

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

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

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

一个例子是:

存储库调用方法 GetAllCarrots();

GetAllCarrots()执行查询SQL Server检索一个List<Carrot>,如果之间没有其他任何事情发生,我想防止这个查询每次都在SQL Server上实际进行(无论它是在不同的Web请求,我希望能够处理那个场景)

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

有什么关于数据库缓存的好资源?

Wou*_*ort 3

为此,您可以使用LinqToCache 。

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

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

这个想法是,当查询结果发生更改时,您可以使用SqlDependency来收到通知。只要结果不改变就可以缓存它。

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