2017-05-29 2 views
0

J'ai un problème de cache dans Fluent NHibernate. Je veux le désactiver pour une requête par ID, par exempleCache NHibernate Disable Cache

session.Get<Person>(10); 

Avez-vous des idées?

+1

Il serait bon que vous puissiez expliquer le problème que vous avez un peu plus. –

+0

Vous demandez peut-être comment appliquer une mauvaise solution à votre problème réel. –

Répondre

1

Faites-vous référence au cache de premier niveau (session)?
Vous pouvez actualiser l'état d'une entité de la base de données en utilisant Refresh, qui est:

// Will get the state from the first-level cache if already present in the session: 
var entity = Session.Get<EntityType>(entityId); 

// Line below will update the entity with the current state from the database: 
Session.Refresh(entity); 
+0

Si l'entité n'était pas déjà dans le cache, cela entraînera deux requêtes sur la base de données. –

+0

C'est vrai. Je crois que si la situation est comme ci-dessus (vous n'avez pas de référence à l'entité que vous souhaitez actualiser) Session.Load pourrait être utilisé à la place de Session.Get pour éviter cela. –

1

Si vous détenez déjà l'entité, appelez directement session.Refresh(person) sur elle au lieu de l'obtenir à nouveau.

Vous pouvez également l'exclure avec session.Evict(person), l'empêchant ainsi d'être dans la session, et non plus suivi des modifications. Puis jetez-le et éventuellement le récupérer plus tard si vous en avez besoin.

Sinon, il est inhabituel de considérer qu'il est difficile de l'obtenir à partir du cache de session. Ceci est souvent un signe de mauvaise utilisation de la session, comme l'utilisation d'une même session à travers de nombreuses interactions utilisateur (anti-pattern).

Vous pouvez toujours faire Fredy proposes. Ou appelez session.Clear() avant d'obtenir pour effacer le cache de session (et en perdant toutes les modifications en attente d'ailleurs).