Подключение к нескольким базам данных разных типов с помощью NHibernate - PullRequest
1 голос
/ 16 сентября 2010

Я пишу приложение, в котором пользователи могут создавать один или несколько «каталогов», которые хранятся в базе данных.Однако я хочу разрешить использование нескольких форматов баз данных (SQL Server и SQL Lite) и хочу, чтобы пользователь мог одновременно открывать в приложении несколько каталогов.Расположение баз данных каталога не будет известно до времени выполнения.Поэтому я не хочу, чтобы какие-либо конкретные параметры базы данных хранились в конфигурации приложения.

Я только начинаю работу с NHibernate, но я планирую создать отображения NHibernate для всех моих классов, связанных с каталогом.Я пытаюсь найти лучший шаблон проектирования, позволяющий мне использовать этот единственный набор сопоставлений с несколькими базами данных одновременно.

Я думаю, что могу опустить файл hibernate.cfg.xml в моем проекте, который указывает на конкретныйбазы данных и провайдера, и вместо этого только встроить файлы сопоставления (.hbm.xml) в мою сборку.Правильно ли это?

Затем, когда мои приложения запускаются, я создаю конфигурацию NHibernate из сборки, которая содержит только информацию сопоставления, а не какую-либо конкретную информацию о поставщике / базе данных.Из этой конфигурации я создам один ISessionFactory.

Затем, когда пользователь захочет открыть каталог, я бы создал ADO.NET IDbConnection для базы данных, которую он указал с правильным провайдером.Затем, чтобы получить доступ к базе данных, я передам это конкретное соединение методу OpenSession () единственного SessionFactory.

ISession session =  sessionfactory.OpenSession(IDbConnection conn);

Я на правильном пути?Будет ли то, что я описываю, работать, или есть лучший способ?


Обновление

Теперь, когда я прочитал больше, я не думаю, что этобуду работать.ISessionFactory настроен для определенного диалекта / драйвера и т. Д. Таким образом, хотя один ISessionFactory может переключаться между несколькими IDBConnections, эти соединения должны быть к одному и тому же типу базы данных.Поскольку ISessionFactory является неизменным, нет способа переключить экземпляр между поддержкой одного типа базы данных другим.Это правильно?Стоит ли вместо этого создавать отдельные ISessionFactories для каждого типа базы данных, которую я хочу поддерживать?

1 Ответ

0 голосов
/ 16 сентября 2010

Вот как я это сделал:

Вам нужны две вещи - несколько фабрик сессий, хранящихся в Словаре, а затем еще один уровень абстракции для доступа к фабрике сессий на основе кода.

Каждая фабрика сеансов будет настраиваться по-разному в зависимости от базы данных.

Код вашего приложения может выглядеть примерно так:

var session = NHibernateSessionManager.OpenSession(factoryCode: "SqlLiteSessionFactory");

Я считаю, что это полезный шаблон, поскольку часто есть причины для совместного использования сопоставлений, но с другой конфигурацией фабрики сеансов: например, вы можете настроить фабрики по-разному для асинхронного ведения журнала или пакетных операций; вы можете использовать разные имена входа в базу данных и т. д. Используя этот шаблон, вы также можете использовать разные сопоставления для одних и тех же объектов - например, возможно, конкретным пользователям необходим доступ к объекту через представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...