Как я могу подключиться к различным БД на разных машинах с помощью nhibernate и unhaddins?
Я пытаюсь соединиться с nHibernate и Unhaddins на разных машинах, у каждого есть база данных в Oracle. У них разные таблицы с разными базами данных.
Мне нужно прочитать таблицу, давайте назовем ее как C_SM_SEND
,
Внутри этой таблицы у меня есть столбец Body
, который будет содержать XML.
Другой процесс прочитает эту таблицу, получит этот XML и вставит его значения в другую таблицу, назовем ее как PC_TO_SM_PRIM_DATA
, Давайте не будем беспокоиться о столбцах или именах таблиц.
Теперь важно то, что мне придется читать одну таблицу в одной БД на одной машине => "MACHINE1/ORCL", читать таблицу с именем "C_SM_SEND" и вставлять значения в другую таблицу другой БД другой машины => ". MACHINE2/SERV", написание таблицы с именем PC_TO_SM_PRIM_DATA.
Кроме того, помните: отображение каждой таблицы отличается!
Я прочитал несколько статей, в которых объясняется, как NHibernate подключается к разным машинам, используя uNHAddIns. Ничего из того, что я прочитал, не сработало.
Мое приложение делается по стандартам MVVM, IoC, а также использую репозиторий.
Я прочитал также эту статью Фабио Мауло, но безуспешно:
Настройка поставщиков фабрики сеансов
Любая помощь будет приветствоваться.
С уважением,
Густаво.
1 ответ
Что вам нужно, так это один SessionFactory на базу данных. Так что если у вас есть 2 базы данных, которые вы используете, это 2 SessionFactories - по одной для каждой базы данных. Все абстракции в uNHAddins просто сводятся к созданию и управлению этими SessionFactories.
Допустим, вы используете 2 базы данных - Database1
а также Database2
, Database1
есть одна таблица - C_SM_SEND
, Database2
есть другая таблица - PC_TO_SM_PRIM_DATA
, Действительно простой способ структурировать ваш код - это иметь 2 класса, которые создают SessionFactories:
public class Database1
{
private ISessionFactory _sessionFactory;
public Database1SessionFactory()
{
//Build your session factory for Database1 here
//with the entity C_SM_SEND, connection string to Database1, etc, etc.
}
public ISession OpenSession()
{
return _sessionFactory.OpenSession();
}
}
public class Database2
{
private ISessionFactory _sessionFactory;
public Database1SessionFactory()
{
//Build your session factory for Database2 here
//with the entity PC_TO_SM_PRIM_DATA, connection string to Database2, etc, etc.
}
public ISession OpenSession()
{
return _sessionFactory.OpenSession();
}
}
Вы можете сопоставить Database1
а также Database2
используя ваш IoC. Это оставляет просто открытие правильного сеанса и чтение / запись ваших сущностей.
Транзакционные операции могут выполняться в обеих базах данных:
using (var tx = new TransactionScope())
{
//session1.Save(obj1);
//session2.Save(obj2);
tx.Complete();
}