Путаница в схеме базы данных NHibernate [. \ Hibernate-mapping \ @schema] - PullRequest
3 голосов
/ 20 мая 2009

Я использую NHibernate в первую очередь для базы данных MSSQL, где я использовал схемы MSSQL для различных таблиц.

В моих файлах сопоставления NH (HBM) я указал схему для каждой таблицы в сопоставлении следующим образом:

<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   auto-import="true"
                   schema="xyz">                 <!-- schema specified -->
  <class name="Customer">
    <id name="Id">
      <generator class="native" />
    </id>
    <property name="Name" />
  </class>
</hibernate-mapping>

Для моего модульного тестирования я экспериментировал с SQLite, однако теперь мои сопоставления не выполняются, поскольку NH сообщает, что база данных "xyz" не найдена.

Я понимаю, что существует разница в интерпретации схемы , так какова интерпретация / реализация NH и каков наилучший подход при использовании схемы?

Кстати: поиск в Интернете по ключевым словам, таким как «схема базы данных nhibernate», ничего не дал.

Ответы [ 3 ]

6 голосов
/ 20 мая 2009

«Стандартная» интерпретация состоит в том, что таблица имеет имя из трех частей: «CATALOG.SCHEMA.TABLE»: это имена, используемые в стандартных (ISO-SQL стандарт?) Представлениях «information_schema». Hibernate (предположительно также NHibernate) следует этому соглашению, вы можете указать каталог и схему в отображении класса, а также default_catalog и default_schema в конфигурации.

В своей собственной модульной тестовой среде (с использованием Hypersonic) я массировал конфигурацию Hibernate перед сборкой SessionFactory: я сам делал это, например, для установки HSQL-совместимых IdentifierGenerators, но вы можете, вероятно, пройти очистку свойств схемы сопоставленные классы.

В общем, я стараюсь вообще не указывать схемы и каталоги в приложениях. В Oracle я обычно создаю синонимы, чтобы пользователи могли видеть объекты в своем собственном пространстве имен; в PostgreSQL установите search_path в конфигурации базы данных; в SQL Server поместите все таблицы в 'dbo'.

1 голос
/ 20 мая 2009

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

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

1 голос
/ 20 мая 2009

Класс NHibernate.Mapping.Table имеет метод GetQualifiedName(NHibernate.Dialect.Dialect dialect), который определяется следующим образом:

public string GetQualifiedName(NHibernate.Dialect.Dialect dialect)
{
    string quotedName = this.GetQuotedName(dialect);
    return ((this.schema == null) ? 
        quotedName : 
        (this.GetQuotedSchemaName(dialect) + '.' + quotedName));
}

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

...