2010-11-04 1 views
2

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

ответ

1

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

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

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

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