Pregunta

Tengo problemas con la implementación de SqlDependency en mi proyecto.

Estoy usando SqlDependency en un servicio WCF. WCF servicio mantiene entonces en la memoria caché de todos los resultados de todas las tablas con el fin de tener un enorme aumento de la velocidad. Todo parece estar funcionando bien, excepto cuando estoy haciendo una actualización de fila de la tabla. Si puedo añadir o eliminar una fila en mi mesa, DataContext se actualiza y la memoria caché se invalida y sin problemas. Pero cuando se trata de una actualización de fila de la tabla, no pasa nada, la caché no es invalidada y cuando miro en modo de depuración en el contenido de DataContext, no hay cambios parece estar allí.

Este es el código que estoy usando (nota que estoy usando el objeto 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;
        }

He creado un método de extensión por lo que todo lo que tengo que hacer es consultar cualquier tabla así:

List<MyTable> list = context.MyTable.LinqCache();

Mi DataContext se abre en el Application_OnStart Global.asax y se almacena en caché, por lo que puede usarlo cuando quiera en mi servicio WCF. Además, en este momento estoy abriendo el objeto SqlDependency con

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

Por lo tanto, es que una limitación de SqlDependency, o estoy haciendo algo mal / falta algo en el proceso?

¿Fue útil?

Solución

Creo que el problema es que, aunque lo hace todo el trabajo para establecer el objeto de comando, a continuación, hacer:

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

¿Qué se va a utilizar el comando SQL y tirar a continuación, los resultados de LINQ a SQL generará su propia forma interna a través query.ToList (). Afortunadamente, usted puede pedir LINQ a SQL para ejecutar su propio comando y traducir los resultados para usted así que intenta reemplazar esas dos líneas con:

results = db.Translate<T>(cmd.ExecuteReader());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top