2009-04-20 13 views
15

¿Es posible crear una conexión de solo lectura en nHibernate?cómo crear una sesión de solo lectura en nHiberate?

Solo lectura: donde nHibernate no eliminará ningún cambio en la base de datos implícita o explícitamente.

Al cerrar una conexión nhibernate, automáticamente se eliminan los cambios en el objeto persistente.

Configuración del modo de descarga a nunca es de una forma, pero es reversible (es decir, algunos códigos pueden restablecer el modo de descarga).

+0

Sé que esta es una pregunta antigua (en tiempo de Internet), pero ¿cuál es el motivo de su preocupación acerca de que esto sea "reversible"? –

Respuesta

13

Creo que ya ha encontrado la solución, configurando el modo lavado nunca. Sí, es modificable, pero incluso si no lo fuera, el código podría simplemente crear otra sesión que tuviera un modo de descarga diferente.

Creo que la solución es apropiada para sugieren de sólo lectura con session.FlushMode = FlushMode.Never y hacerla cumplir mediante el uso de una conexión a la base de datos que sólo tiene permisos SELECT (o lo que sea apropiado para su situación). El mantenimiento de fábricas independientes de ISessionFactory podría ayudar permitiendo algo como ReadOnlySessionFactory.Create().

0

La acumulación de cambios, y nunca acaba de lavado parece una mala solución para mí. Publiqué una pregunta similar. La solución provista usa un enfoque diferente. Todos los eventos están configurados como vacíos, y por lo tanto ignorados. Mi sensación es que es un mejor enfoque.

Me sorprende que esto no sea más fácil de hacer. Me gusta el enfoque del marco de entidad de usar un método de extensión .AsNoTracking() que asegura que las consultas de solo lectura permanezcan así.

How to create an NHibernate read-only session with Fluent NHibernate that doesn't accumulate updates?

+0

No, las actualizaciones no se acumulan después de establecer session.FlushMode = FlushMode.Never. Lo comprobé anulando SaveOrUpdateEventListeners como en su pregunta, y el oyente no llama con FlushMode.Never. En su solución se llama NoOpEventListener para cada cambio – razon

1

Hay una característica de sólo lectura más reciente en NHibernate (no sé qué versión, pero es en 3.3.0 con seguridad). Se puede establecer la sesión de sólo lectura utilizando la siguiente:

session.DefaultReadOnly = true 

Se desactiva la caché para los viejos valores y por lo tanto mejora el rendimiento y el consumo de memoria.

Hay un chapter about read-only entities en el NHibernate reference documentation.

Cuestiones relacionadas