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

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

Ответы [ 4 ]

11 голосов
/ 29 января 2009

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

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

3 голосов
/ 13 января 2011

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

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

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

1 голос
/ 29 января 2009

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

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

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

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

1 голос
/ 29 января 2009

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...