Как вы изменяете строку подключения NHibernate для HTTP-запроса?

Как на самом деле выше.

4 ответа

Решение

ISessionFactory.OpenSession() может быть предоставлен с IDbConnection.

Другой вариант - реализовать IConnectionProvider, который бы создавал соответствующие экземпляры IDbConnection в зависимости от некоторого условия (которое должно быть глобальным, что делает это решение не очень чистым).

Обратите внимание, что при поставке IDbConnection в OpenSession(), вы не сможете использовать кэш 2-го уровня.

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

... "Это не ошибка. Если вы управляете своими собственными соединениями, NHibernate отключает использование кэша второго уровня для безопасности сеанса."...

Ну, это может быть сложно, но я думаю, что это не должно быть сделано, но вот идея:

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

Я не знаю, если это лучший метод, но может работать. Вы также можете иметь 2 конфигурационных XML-файла и сделать это:

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

Отвечая на комментарии, вы можете иметь несколько инициализированных и готовых к использованию сеансовых фабрик, но это не совсем "изменить строку подключения". Затем выберите тот, который вам нужен. Дорогая часть создает объект конфигурации и вызывает Configure().

Также есть библиотека NHibernate Burrow, которая управляет несколькими сессиями одновременно и выбирает правильную в зависимости от сущности.

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

SessionFactory - это то, что настраивает ваши соединения, диалекты и т. Д., Поэтому, если вы хотите изменить строку подключения, вам нужно перенастроить. Но, да, ваш комментарий правильный. Настройка фабрики сеансов является одной из самых дорогих операций, поэтому вы хотите делать это только тогда, когда вам это нужно, и никогда больше.

В nHibernate Burrow есть несколько действительно хороших концепций общения. Если вы посмотрите на то, как они управляют сессиями, вы можете найти некоторые творческие идеи для управления несколькими сессиями в нескольких базах данных.

У меня есть предложение, аналогичное принципу @Marc: вы можете красиво инкапсулировать динамические соединения в провайдере. Взгляните на вики-сайт nhibernate.info о провайдерах динамических соединений. Вы можете легко создать провайдера, в котором вы передаете необходимую информацию, чтобы создать сеанс, указывающий на нужную вам базу данных.

Я использую nHibernate 2.0 поверх 100+ баз данных (все имеют одинаковую схему, но физически разделенные данные), так что это определенно можно сделать с небольшим TLC;-)

Другие вопросы по тегам