我在我的项目中执行SqlDependency时遇到问题。SqlDependency和表更新不刷新DataContext
我在WCF服务中使用SqlDependency。然后,WCF服务在内存中缓存所有表的所有结果,以获得巨大的速度增益。一切似乎工作正常,除非我正在做一个表行更新。如果我在表中添加或删除一行,DataContext会刷新并且缓存无效而无问题。但是,当涉及到表行更新时,什么都不会发生,缓存不会失效,并且当我在调试模式下查看DataContext的内容时,似乎没有任何更改。
下面是我使用的代码(注意,我使用的System.Runtime.Caching对象):我创建了一个扩展方法
public static List<T> LinqCache<T>(this Table<T> query) where T : class
{
ObjectCache cache = MemoryCache.Default;
string tableName =
query.Context.Mapping.GetTable(typeof(T)).TableName;
List<T> result = cache[tableName] as List<T>;
if (result == null)
{
using (SqlConnection conn =
new SqlConnection(query.Context.Connection.ConnectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(
query.Context.GetCommand(query).CommandText, conn);
cmd.Notification = null;
cmd.NotificationAutoEnlist = true;
SqlDependency dependency = new SqlDependency(cmd);
SqlChangeMonitor sqlMonitor =
new SqlChangeMonitor(dependency);
CacheItemPolicy policy = new CacheItemPolicy();
policy.ChangeMonitors.Add(sqlMonitor);
cmd.ExecuteNonQuery();
result = query.ToList();
cache.Set(tableName, result, policy);
}
}
return result;
}
因此,所有我需要做的就是查询任何表这样的:
List<MyTable> list = context.MyTable.LinqCache();
我的DataContext开在Global.asax中Application_OnStart
并存储在缓存中,这样我就可以使用它时,我想在我的WCF服务。同样在这一刻,我打开与
SqlDependency.Start(
ConfigurationManager.ConnectionStrings[myConnectionString].ConnectionString);
所以的SqlDependency对象,是的SqlDependency的限制,或者我做错了什么/丢失在这个过程中的东西吗?