我有一个方法可以从特定数据库获取所有记录,然后将其存储在缓存中。下次调用该方法时,它首先检查缓存,看它是否只能返回缓存版本,如果该缓存对象尚未过期。
问题:每次调用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()方法。
我希望这是有道理的!
答案 0 :(得分:2)
您可以使用SqlDependency Class。基本上,它可以让您检测查询数据的更改(如果您使用M $ SQL Server 2005 +)。
您可能希望了解Service Broker技术(如果使用M $ SQL Server 2005 +)。
直接在您的应用程序中检测它可能是不够的 - 您将无法检测到在您的应用程序之外执行的任何更改。
答案 1 :(得分:0)
查看DataContext.GetChangeSet() - 您可以继承DataContext并覆盖SubmitChanges方法以根据ChangeSet内容清除相关缓存,然后调用MyBase.SubmitChanges(...)。