NHibernate: отображение сущностей между несколькими БД на разных серверах без связи с БД - PullRequest
5 голосов
/ 09 марта 2011

Используя последнюю версию NHibernate (и, возможно, некоторые плагины), возможно ли отобразить сущности между несколькими базами данных на разных серверах без связи с БД?

В качестве фона я хочу реализовать что-то похожее на то, что описано в этом DBA.SE сообщении .

Ответы [ 2 ]

0 голосов
/ 13 декабря 2013

После некоторого гуглинга (хотя я еще не пробовал) вы можете, по крайней мере, сопоставить классы с таблицами в разных базах данных на одном сервере, используя

<class name="..." table="..." schema="database.schema">
  ...
</class>

в отображении.

Но ИМХО это дерьмовое решение, потому что оно не кажется независимым от сервера.По-видимому, NHibernate просто объединяет значение схемы со значением таблицы при создании запроса - и для большинства серверов «простое размещение базы данных там со схемой» приводит к синтаксису, который работает HAPPENS.НО вы просто не говорите NHibernate «это схема» и «это база данных», чтобы NHibernate мог точно решить, как построить запрос - вы путаетесь с созданием запроса, вставляя контекстные данные там, где они не принадлежат.

ИМХО, NHibernate должен подавлять такие грязные хаки и выдавать исключение, если значение "схемы" содержит.

В любом случае, похоже, нет технической причины, по которой вы не сможетесделайте еще один шаг и используйте schema = "server.database.schema", где "server" - это имя связанного сервера (см., например, http://technet.microsoft.com/de-de/library/ms190479.aspx)

Помимо этого грязного хака,Кажется, каждый рекомендует использовать несколько фабрик сессий.

0 голосов
/ 10 марта 2011

У меня есть интересный ответ в списке рассылки nhusers .Выдержка следующая:

От Джейсона Мекли

[...], если вы говорите о хранении одного объекта в нескольких базах данных, ответ будет не совсем понятным,Вы можете быть в состоянии сделать что-то с пользовательскими типами пользователей и / или слушателями событий, чтобы увлажнить объект, но это было бы затруднительно для обслуживания.

Другой подход заключается в передаче данных из одного БД в другой с использованиемпроцесс ETL.похож на репликацию, но только передает данные, необходимые для другой базы данных.в итоге вы получаете 1 базу данных с возможностью записи и множество баз данных для чтения.затем вы сопоставляете домен с одной базой данных.

Другой вариант - определить, почему существует несколько баз данных.если они представляют разные типы данных / объектов, то явно выражают это в домене.например, CustomerWithAddress - это объект, отличный от CustomerOrder.Если вам нужна информация из обоих источников, запросите каждую базу данных в отдельности и создайте прогноз в коде.

var x = session1.get (id);var y = session2.get (id);возврат слияния (x, y);

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