プロジェクトでの 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の制限ですか、それともプロセスで何か間違っている/欠けているのですか?