SqlDependency и обновление таблицы не обновляют DataContext

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


person MissRaphie    schedule 04.11.2010    source источник


Ответы (1)


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

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

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

results = db.Translate<T>(cmd.ExecuteReader());
person DamienG    schedule 12.02.2012