2015-03-23 3 views
0

Можно переопределить свойство Тип отображения (файл hbm.xml, NOT fluent) на NHibernate?Override NHibernate Тип свойства runtime

Контекст: Я работаю над приложением, которое подключается в основном на SQL Server (LEGACY DATABASE SCHEMA), но оно должно работать и с некоторыми базами данных Oracle. У нас много сущностей, и мы отказались хранить две версии файлов сопоставления, поэтому мы решили определить базовое сопоставление (SQL Server) и сделать некоторые управляемые изменения для работы над Oracle (например, генератор идентификаторов, столбец и имена таблиц, ...).

Теперь у нас есть новая проблема с полями LONG Oracle (LEGACY OBSOLETE поле типа), он не работал на NHibernate, и мы должны определить пользовательские IUserType (http://sonyarouje.com/2012/11/07/nhibernate-and-oracle-long-varchar-field/), это решение совместимо с SQLServer, но это требует DLL Oracle.DataAccess.dll, и во избежание этой проблемной DLL мы установили бы этот настраиваемый тип во время выполнения только при подключении к Oracle. Но тип типа элемента (NHibernate) является readonly, и я не нашел способа его установить.

Я использую NHibernate 3.3.

ответ

0

Мы должны различать ISessionFactory и конфигурацию NHibernate.

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

3.1. Programmatic Configuration

Но когда мы используем конфигурацию, чтобы получать ISessionFactory - он не может быть изменен:

Экземпляр NHibernate.Cfg.Configuration представляет собой полный набор отображений типов .NET приложения в базу данных SQL. Конфигурация используется для создания (неизменяемого) ISessionFactory. Сопоставления скомпилированы из различных файлов сопоставления XML.

Так что, я бы сказал, мы можем в этом случае создать больше Фабрики, от более конфигураций (которые могут быть довольно динамически создаваемых). И это может решить проблему на основе среды ... Из какого-то условия/конфигурации мы узнаем, какую конфигурацию NHibernate использовать ... и это даст нам соответствующий Factory.

+0

Спасибо Radim, но, несмотря на «неизменность» конфигурации, я изменил некоторые параметры db (генератор идентификаторов, имена таблиц и столбцов ...), и я подумал, что можно изменить тип свойства в так же. Но я перехватил конфигурацию, чтобы динамически назначать тип свойства, когда я в Oracle, я не хочу копировать и вставлять файл сопоставления, потому что у меня много объектов (около 200), и я не могу mantain 2 версии всех объектов. – Marc

+0

Марк, я бы предложил ... не делай этого. Это не способ, а не способ, которым можно было бы сохранить ... это принесет вам только проблемы. Просто используйте конфигурацию, условную, чтобы создать специальные Заводы для специальных целей. Все, что находится внутри фабрики сеансов, НЕ для внешней настройки. Это ООП ... и инкапсуляция. Что делать, если новая версия меняет что-то? Так. Если я могу дать вам совет - создайте специальную динамическую конфигурацию - НЕ меняйте фабрику после ее создания. Надеюсь, это немного помогает ... –

+0

[Мой последний комментарий был отправлен до того, как я его завершу] Последний вопрос: могу ли я перехватить конфигурацию, чтобы динамически назначать тип свойства, когда я в Oracle, я не хочу скопировать и вставить файл сопоставления, потому что у меня много объектов (около 200), и я не могу использовать 2 версии всех объектов. Я хочу работать с базой и «конкретными и централизованными» изменениями над ней. – Marc

Смежные вопросы