Ho NHibernate (con NHibernate.Linq e Fluent NHibernate) impostato con la cache di query. Tutto funziona correttamente finché non eseguo lo session.Save(new Widget())
(ad esempio, SQL INSERT
). Dopo questo punto, tutte le query su quel tipo di Widget
mancano la cache della query. Le query su altri tipi di entità sono memorizzate nella cache correttamente.NHibernate - Query manca la cache della query dopo aver salvato una nuova entità
using (ISession session = MySessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
// this INSERT screws things up
var widget = new Widget {Name = "Foo"};
session.Save(widget);
var query = (from w in session.Query<Widget>().Cacheable()
where w.Name == "Bar"
select w);
var fetched1 = query.FirstOrDefault();
var fetched2 = query.FirstOrDefault(); // miss?!
transaction.Commit();
}
}
Se inizio un nuovo Transaction
, il problema persiste. Se avvio un nuovo Session
, il problema scompare. Questo mi sembra strano, dal momento che la mia comprensione era che il cache di secondo livello veniva ripristinato per SessionFactory
(non Session
).
Non penso che questo sia importante, ma sto usando lo HashtableCacheProvider
, dato che sto testando proprio adesso.
quale errore si è verificato, signore? – spajce
Non è un errore nel senso che è stata lanciata un'eccezione. Piuttosto, la seconda query ('var fetched2 = query.FirstOrDefault();') salta la cache della query e colpisce direttamente il database (che non è il comportamento previsto). –
Hai abilitato la cache della query? Penso che devi farlo separatamente dalla cache delle entità. –