【问题标题】:Cache Entity Framework data and track its changes?缓存实体框架数据并跟踪其变化?
【发布时间】:2012-03-07 19:35:31
【问题描述】:

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

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

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

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

一个例子是:

存储库调用方法GetAllCarrots();

GetAllCarrots() 在 SQL Server 上执行查询以检索 List<Carrot>,如果两者之间没有发生任何其他事情,我想防止每次在 SQL Server 上实际执行此查询(不管它是在不同的Web 请求,我希望能够处理这种情况)

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

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

【问题讨论】:

    标签: c# sql entity-framework caching


    【解决方案1】:

    您可以为此使用LinqToCache。

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

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

    这个想法是您使用SqlDependency 在查询结果更改时收到通知。只要结果没有改变,你就可以缓存它。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 2013-10-04
        • 2019-07-04
        • 1970-01-01
        相关资源
        最近更新 更多