У меня возникают проблемы с реализацией SqlDependency в моем проекте.SqlDependency и обновление таблицы не обновляются DataContext
Я использую SqlDependency в службе WCF. Служба 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 с
SqlDependency.Start(
ConfigurationManager.ConnectionStrings[myConnectionString].ConnectionString);
Итак, что ограничение SqlDependency, или я делаю что-то неправильно/отсутствующее что-то в этом процессе?