2010-11-04 84 views
2

我在我的项目中执行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的限制,或者我做错了什么/丢失在这个过程中的东西吗?

回答

1

我认为问题是,虽然你在设置命令所有的工作对象,你那么做:

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

这是要使用你的SQL命令,并扔掉了结果的话,LINQ到SQL将通过query.ToList()在内部生成它自己的内容。谢天谢地,您可以让LINQ to SQL来执行您自己的命令并为您翻译结果,因此请尝试将这两行替换为:

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