在linq到sql的表crud操作上触发缓存清除

时间:2010-07-13 17:30:09

标签: c# linq-to-sql

我有一个方法可以从特定数据库获取所有记录,然后将其存储在缓存中。下次调用该方法时,它首先检查缓存,看它是否只能返回缓存版本,如果该缓存对象尚未过期。

问题:每次调用dataContext.SubmitChanges()时如何触发方法?例如,如果我从Book表中获取所有书籍并将其存储在Cache [“AllBooks”]中,我希望在与Book表相关的任何crud操作中清除此缓存对象。

我目前正在做什么

var b = dataContext.Books.Where(x => x.BookId == 4).SingleOrDefault();
b.Title = "new title for book w/ id of 4";
dataContext.SubmitChanges();
ClearBookCache();

...后

private void ClearBookCache() {
    CustomCachingSystem.Clear["AllBooks"];
}

我想要什么:ClearBookCache()会在任何Book表crud操作中自动触发,而我每次在Book表上执行crud操作时都要记得调用它。 / p>

注意:如果我对与Book表无关的表执行crud操作,我不希望调用ClearBookCache()方法。

我希望这是有道理的!

2 个答案:

答案 0 :(得分:2)

您可以使用SqlDependency Class。基本上,它可以让您检测查询数据的更改(如果您使用M $ SQL Server 2005 +)。

您可能希望了解Service Broker技术(如果使用M $ SQL Server 2005 +)。

直接在您的应用程序中检测它可能是不够的 - 您将无法检测到在您的应用程序之外执行的任何更改。

答案 1 :(得分:0)

查看DataContext.GetChangeSet() - 您可以继承DataContext并覆盖SubmitChanges方法以根据ChangeSet内容清除相关缓存,然后调用MyBase.SubmitChanges(...)。