Domanda

Ho problemi con l'attuazione di SqlDependency nel mio progetto.

sto usando SqlDependency in un servizio WCF. Servizio WCF tiene poi nella memoria cache tutti i risultati di tutte le tabelle in modo da avere un enorme guadagno di velocità. Tutto sembra funzionare bene, tranne quando sto facendo un aggiornamento di riga della tabella. Se posso aggiungere o eliminare una riga nella mia tavola, DataContext viene aggiornata e la cache viene invalidata senza problemi. Ma quando si tratta di un aggiornamento di riga della tabella, non succede nulla, la cache non è inficiata e quando mi guardo in modalità debug il contenuto di DataContext, nessun cambiamento sembra essere lì.

Ecco il codice che sto usando (nota che sto utilizzando l'oggetto 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;
        }

Ho creato un metodo di estensione in modo tutto quello che devo fare è quello di interrogare qualsiasi tabella del genere:

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

Il mio DataContext è aperto alla Application_OnStart Global.asax e memorizzato nella cache, in modo da poter usare quando voglio nel mio servizio WCF. Come pure in questo momento sto aprendo l'oggetto SqlDependency con

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

Quindi, è che una limitazione della SqlDependency, o sto facendo qualcosa di sbagliato / manca qualcosa nel processo?

È stato utile?

Soluzione

Credo che il problema è che anche se si fa tutto il lavoro nella creazione dell'oggetto comando poi fare:

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

che sta per utilizzare il comando SQL e buttare via i risultati poi LINQ to SQL genererà il proprio internamente tramite query.ToList (). Per fortuna si può chiedere LINQ to SQL per eseguire il proprio comando e tradurre i risultati per voi in modo tenta di sostituire quelle due righe con:

results = db.Translate<T>(cmd.ExecuteReader());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top