Comme ci-dessus vraiment.Comment modifier la chaîne de connexion de NHibernate par requête HTTP?
Répondre
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).
Exactement ce que je voulais, simple et fait ce qu'il dit sur l'étain –
Notez que la connexion doit être ouverte avant de l'utiliser NHibernate ne le fera pas pour vous (je viens d'apprendre) – nickd
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 –
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
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 ? –
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. –
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
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. –
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. ;-( –
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é. » .. .
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
- 1. Modifier la réponse Http
- 2. Modifier la requête linq comment?
- 3. VS2005 C# Modifier par programme la chaîne de connexion contenue dans app.config
- 4. Conserver les données HTTP POST lorsqu'une requête est interrompue par une page de connexion
- 5. comment définir le délai d'expiration de la requête à partir de la chaîne de connexion SQL
- 6. PHP - Passer la liste déroulante par la chaîne de requête
- 7. NHibernate - Requête par exemple - Sous-requête
- 8. Comment crypter la chaîne de connexion Sql?
- 9. Comment connaître la requête générée par Fluent NHibernate
- 10. Dans nHibernate, comment puis-je changer dynamiquement la connexion à la base de données (DB différent)?
- 11. Comment modifier la chaîne de connexion TFS 2010 Beta 2 pour la configuration DB
- 12. Limite de connexion HTTP ASP.NET
- 13. Modification de la chaîne de connexion de LINQ dmbl programmaticaly
- 14. Changement de chaîne de connexion
- 15. Problème d'authentification de la requête http IIS
- 16. NHibernate: Convertir Guid en chaîne dans la requête
- 17. Chaîne de connexion NHibernate: comment spécifier le numéro de port et le serveur \ instance?
- 18. Chaîne de requête css
- 19. Comment puis-je modifier une chaîne d'agent utilisateur par programme?
- 20. Réécrire chaîne de requête
- 21. Comment modifier la connexion dans EclipseLink
- 22. Modifier le nom de connexion
- 23. Nhibernate numéro de requête
- 24. Comment configurer NHibernate pour utiliser la chaîne de connexion de la section de configuration <connectionStrings>
- 25. Requête de cache NHibernate
- 26. Chaîne de connexion ASP.NET
- 27. Annulation d'une connexion d'authentification HTTP?
- 28. Détection côté client de la méthode de requête HTTP
- 29. Erreur Http 503 dans la connexion de servlet
- 30. Comment fermer une connexion NHibernate?
Notez que lors de la fourniture d'un IDbConnection à OpenSession(), vous ne serez pas en mesure d'utiliser le cache de niveau 2 (voir https://forum.hibernate.org/viewtopic.php?f=25&t=959178) – gurra777