2

プロジェクトでの SqlDependency の実装に問題があります。

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 オブジェクトを次のように開いています。

SqlDependency.Start(
    ConfigurationManager.ConnectionStrings[myConnectionString].ConnectionString);

それで、それはSqlDependencyの制限ですか、それともプロセスで何か間違っている/欠けているのですか?

4

1 に答える 1

1

問題は、コマンド オブジェクトをセットアップする際にすべての作業を行うにもかかわらず、次のことを行うことだと思います。

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

SQLコマンドを使用して結果を破棄すると、LINQ to SQLはquery.ToList()を介して内部的に生成します。ありがたいことに、LINQ to SQL に独自のコマンドを実行して結果を変換するように依頼できるので、これらの 2 行を次のように置き換えてみてください。

results = db.Translate<T>(cmd.ExecuteReader());
于 2012-02-12T17:54:37.980 に答える