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?
  •   
È stato utile?

Soluzione

Ci sono un paio di modi per affrontare questo problema:

  1. 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.

  2. Si potrebbe o mettere in una chiamata a Session.Refresh() all'interno del vostro metodo di GetPerson() per ottenere sempre lo stato più aggiornato dal database o si potrebbe esporre tale funzionalità attraverso il proprio metodo di Refresh().

  3. In alternativa, se si dispone di una maniglia sull'oggetto Person stesso, si potrebbe anche provare un Session.Evict() per rimuovere l'oggetto Person 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top