2009-01-29 9 views

Respuesta

10

Un ISessionFactory.OpenSession() se puede suministrar con una IDbConnection.

Otra opción es implementar un IConnectionProvider que cree las instancias de IDbConnection apropiadas dependiendo de alguna condición (que tiene que ser global, por lo que esta solución no está muy limpia).

+0

Exactamente lo que quería, simple y hace lo que dice en la lata. –

+1

Tenga en cuenta que la conexión debe ser abierta antes de usarla. NHibernate no lo hará por usted (Acabo de enterarme). – nickd

+0

El IConnectionProvider depende en una condición global es problemático. Me gustaría que hubiera alguna manera de pasar los datos de configuración al proveedor cuando se crea la sesión. –

0

Bueno, puede ser difícil pero y creo que no se debe hacer, pero aquí está la idea:

var cfg = new Configuration(); // Get a new NHibernate Configuration 
cfg.SetProperty("connection.connection_string", yourConnectionString); // Alter the property 
cfg.Configure(); // Configure with this configuration 
var sf = cfg.BuildSessionFactory(); // Get a new ISessionFactory 

No sé si este es el mejor método, pero puede funcionar. Se podría así tener archivos XML de configuración 2 y hacer esto:

var cfg = new Configuration("hibernate1.cfg.xml"); // OR 
var cfg = new Configuration("hibernate2.cfg.xml"); 

En respuesta a los comentarios, puede tener varias fábricas de sesión inicializados y listos para su uso, pero eso no es exactamente "cambiar la cadena de conexión". Luego elige el que necesitas. La parte costosa es crear el objeto Configuración y llamar a Configurar().

También existe la biblioteca NHibernate Burrow, que gestiona varias sesiones al mismo tiempo y elige la correcta dependiendo de la entidad.

var session = new BurrowFramework().GetSession(); // default session 
var session = new BurrowFramework().GetSession(typeof(Entity)); // session that manages Entity class 
+0

Gracias Marc, sin embargo, pensé que SessionFactory solo debería crearse una sola vez porque es un procedimiento costoso ? –

+0

Cambié mi respuesta para completarla. Como dijo @ joshua.ewer, Burrow puede ayudar. De todos modos, evite crear fábricas de sesión más de una vez por configuración. –

0

La SessionFactory es lo que configura sus conexiones, dialectos, etc., por lo que si desea cambiar la cadena de conexión, tendrá que volver a configurar. Pero, sí, tu comentario es correcto. Configurar una fábrica de sesiones es una de las operaciones más caras, por lo que solo quiere hacerlo cuando lo necesite y nunca más.

Hay algunos conceptos de conversación realmente geniales en nHibernate Burrow. Si observa cómo están administrando la sesión, puede encontrar algunas ideas creativas para administrar múltiples sesiones en múltiples bases de datos.

Tengo la sugerencia de que lo mismo que el principio de @ Marc: puede encapsular las conexiones dinámicas en un proveedor. Eche un vistazo al nhibernate.info wiki regarding dynamic connection providers. Puede crear fácilmente un proveedor en el que transfiera la información que necesita para crear una sesión que apunte a la base de datos que desea.

estoy usando NHibernate 2.0 en la parte superior de más de 100 bases de datos (todos tienen mismo esquema, pero los datos físicamente separados) por lo que definitivamente se puede hacer con un poco de TLC ;-)

+0

Configurar una ISession es en realidad extremadamente barato. Lo * que * es caro es la creación de ISessionFactory. –

+0

Estaba respondiendo al comentario/pregunta de @marc de "SessionFactory solo debe crearse una vez", pero después de ver mi respuesta, mi redacción implica que Session es la cara. ;-( –

2

Tenga en cuenta que al suministrar IDbConnection a OpenSession(), no podrá utilizar la memoria caché de segundo nivel.

Ver https://forum.hibernate.org/viewtopic.php?f=25&t=959178

... "Esto no es un error. Si está administrando sus propias conexiones, NHibernate desactiva el uso de la caché de segundo nivel para la sesión para estar seguro." .. .

+1

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas solo de enlace pueden dejar de ser válidas si la página vinculada cambia – Marusyk

Cuestiones relacionadas