2013-05-29 15 views
5

È possibile impostare la modalità di sola lettura su entità caricate utilizzando il provider Linq di NHibernate?NHibernate Linq in modalità di sola lettura

Ad esempio, il seguente può essere fatto con Session.QueryOver (e credo con criteri così):

Session.QueryOver(Of Foo)().ReadOnly() 

C'è un equivilent per Session.Query disponibili?

risposta

7

Come indicato nella documentazione 10.1.2. Loading persistent entities as read-only:

Per modificare il comportamento predefinito in modo casi carichi NHibernate entità di classi mutevoli nella sessione e automaticamente li rende sola lettura, chiamare:

Session.DefaultReadOnly = true; 

Per modificare il valore predefinito in modo che le entità caricate da NHibernate non siano fatta di sola lettura, chiamare:

Session.DefaultReadOnly = false; 

Quindi, prima di chiamare Session.Query... chiamata Session.DefaultReadonly = true, perché questa impostazione va al ISession non il provider su di esso.

+0

Grazie per questo! Non ero a conoscenza di questa impostazione a livello di sessione. Strano come hanno implementato un operatore di "Sola lettura" per Criteria e QueryOver, ma non per il provider Linq. – DanP

+1

@DanP, sarebbe una funzionalità semplice e facile da implementare. È possibile aprire un problema su https://nhibernate.jira.com. La fonte è https://github.com/nhibernate/nhibernate-core. Questo probabilmente includerebbe una modifica in 'LinqExtensionMethods' e' NhQueryable'. –

+3

@DiegoMijelshon - Ho aperto il seguente problema: https://nhibernate.jira.com/browse/NH-3470 – DanP

1

se avete bisogno di sola lettura della sessione, l'approccio migliore è qui: how to create a readonly session in nHiberate?

Session.DefaultReadOnly = true; - in questo caso NHibernate si accumulano tutti gli aggiornamenti per le entità (chiamare tutti gli ascoltatori ecc)

session.FlushMode = FlushMode.Never 

in questo caso NHibernate non chiamerò nessun ascoltatore, come so