NHibernate: Come faccio a ignorare la cache e passare direttamente alla banca dati?
-
19-09-2019 - |
Domanda
Si consideri una tipica classe del contesto NHibernate.
public class SampleContext : NHibernateContext
{
public SampleContext(ISession session)
: base(session)
{ }
public IQueryable<Person> People
{
get { return Session.Linq<Person>(); }
}
public Person GetPerson(int id)
{
get { return Session.Linq<Person>().SingleOrDefault(p => p.ID == id); }
}
}
La mia domanda:
- Come potrei riscrivere il metodo GetPerson di ignorare la cache e recuperare i dati direttamente dal database?
Soluzione
Ci sono un paio di modi per affrontare questo problema:
-
I ragazzi Hibernate vi dirà che probabilmente dovrebbe essere aprendo una sessione diversa, al fine di recuperare i dati più recenti del database. Si ricorda che l'intenzione della sessione deve essere ambito per un tempo relativamente breve unità di lavoro.
-
Si potrebbe o mettere in una chiamata a
Session.Refresh()
all'interno del vostro metodo diGetPerson()
per ottenere sempre lo stato più aggiornato dal database o si potrebbe esporre tale funzionalità attraverso il proprio metodo diRefresh()
. -
In alternativa, se si dispone di una maniglia sull'oggetto
Person
stesso, si potrebbe anche provare unSession.Evict()
per rimuovere l'oggettoPerson
la cache di sessione prima di caricarla di nuovo.
Nella mia esperienza, ho provato sia # 2 e # 3 e sono alla fine sempre venire intorno a refactoring per fare # 1.