2009-01-29 4 views

Répondre

10

Un ISessionFactory.OpenSession() peut être fourni avec un IDbConnection.

Une autre option consiste à implémenter un IConnectionProvider qui créerait des instances IDbConnection appropriées en fonction de certaines conditions (qui doivent être globales, rendant ainsi cette solution peu propre).

+0

Exactement ce que je voulais, simple et fait ce qu'il dit sur l'étain –

+1

Notez que la connexion doit être ouverte avant de l'utiliser NHibernate ne le fera pas pour vous (je viens d'apprendre) – nickd

+0

Le IConnectionProvider sur une condition globale est problématique.Je souhaite qu'il y avait un moyen de transmettre des données de configuration dans le fournisseur lorsque la session est créée –

0

Eh bien, il peut être difficile, mais et je pense qu'il ne devrait pas être fait, mais voici l'idée:

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 

Je ne sais pas si cela est la meilleure méthode, mais il peut travailler. Vous pourriez aussi bien avoir 2 configuration des fichiers xml et faire:

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

En réponse aux commentaires, vous pouvez avoir plusieurs usines de session initialisées et prêtes à l'emploi, mais ce n'est pas exactement « changer la chaîne de connexion ». Ensuite, choisissez celui dont vous avez besoin. La partie coûteuse crée l'objet Configuration et appelle Configure().

Il y a aussi la bibliothèque NHibernate Burrow, qui gère plusieurs sessions en même temps et choisit la bonne en fonction de l'entité.

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

Merci Marc, mais je pensais que le SessionFactory ne devrait être créé qu'une seule fois parce que c'est une procédure coûteuse ? –

+0

J'ai changé ma réponse pour l'exhaustivité. Comme dit @ joshua.ewer, Burrow peut aider. Quoi qu'il en soit, évitez de créer des ateliers de sessions plus d'une fois par configuration. –

0

Le SessionFactory est ce qui différencie vos connexions, dialectes, etc, donc si vous voulez changer votre chaîne de connexion, vous devrez reconfigurer. Mais, oui, votre commentaire est juste. La configuration d'une fabrique de sessions est l'une des opérations les plus coûteuses, donc vous ne voulez le faire que lorsque vous en avez besoin et jamais plus.

Il existe de très bons concepts de conversation dans nHibernate Burrow. Si vous jetez un coup d'œil à la façon dont ils gèrent la session, vous pourriez trouver des idées créatives pour gérer plusieurs sessions sur plusieurs bases de données.

J'ai une suggestion que le même principe que @ Marc: vous pouvez bien encapsuler les connexions dynamiques dans un fournisseur. Jetez un oeil à la nhibernate.info wiki regarding dynamic connection providers. Vous pouvez facilement créer un fournisseur dans lequel vous transmettez les informations dont vous avez besoin pour créer une session pointant vers la base de données que vous désirez.

J'utilise NHibernate 2.0 sur des bases de données 100+ (tous ont même schéma, mais les données physiquement séparés) il peut certainement être fait avec un peu ;-) TLC

+0

La mise en place d'un ISession est en réalité extrêmement bon marché. Ce qui * est * cher est la création de ISessionFactory. –

+0

Je répondais au commentaire/question de @ marc: "SessionFactory ne devrait être créé qu'une fois", mais après avoir regardé ma réponse, ma formulation implique que Session est la plus chère. ;-( –

2

Notez que lors de la fourniture d'un IDbConnection à OpenSession(), vous ne pourrez pas utiliser le cache de 2ème niveau.

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

... « Ceci est un bug. Si vous gérez vos propres connexions, NHibernate désactive l'utilisation du cache de second niveau pour la session d'être en sécurité. » .. .

+1

Alors que ce lien peut répondre à la question, il est préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien pour référence.Les réponses de lien seulement peuvent devenir invalides si la page liée change – Marusyk

Questions connexes