SqlDependency и обновление таблицы не обновляют DataContext - PullRequest
2 голосов
/ 04 ноября 2010

У меня проблемы с реализацией SqlDependency в моем проекте.

Я использую 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, или я что-то делаю не так / что-то не так в процессе?

1 Ответ

1 голос
/ 12 февраля 2012

Думаю, проблема в том, что, хотя вы выполняете всю работу по настройке объекта команды, вы затем делаете:

cmd.ExecuteNonQuery();
result = query.ToList();

Что будет использовать вашу команду SQL и выбросить результаты, тогда LINQ to SQL сгенерирует свою собственную внутреннюю функцию с помощью query.ToList (). К счастью, вы можете попросить LINQ to SQL выполнить вашу собственную команду и перевести результаты для вас, поэтому попробуйте заменить эти две строки на:

results = db.Translate<T>(cmd.ExecuteReader());
...