2009-04-29 3 views
3

Я пытаюсь реализовать это решение: NHibernate-20-SQLite-and-In-Memory-DatabasesИспользование SQLite InMemory DB для модульное тестирование MSSQL-DB

Единственная проблема заключается в том, что мы имеем ВСМБ как это:

<class name="aTable" table="[dbo].[aTable]" mutable="true" lazy="false"> 

с [dbo] в имени таблицы , потому что мы работаем с mssql, и это не работает с Sqlite.

Я нашел this posting в группе rhino-tools-dev, где они говорят о просто удалении схемы из сопоставления, но на NH2, похоже, нет classMapping.Schema.

Существует classMapping.Table.Schema, но, похоже, он доступен только для чтения. Например, это не работает:

foreach (PersistentClass cp in configuration.ClassMappings)   { 
    // Does not work - throws a 
    //System.IndexOutOfRangeException: Index was outside the bounds of the array. 
     cp.Table.Schema = ""; 
    } 
  • Есть ли способ сказать Sqlite игнорировать [dbo] (я пробовал attach database :memory: as dbo, но это, похоже, не помогает)?
  • В качестве альтернативы, я могу программно удалить его из классов (к сожалению, изменение hbms невозможно сейчас)?

ответ

1

Мы используем Sqlite для запуска модульных тестов с использованием NH 2.0.1. На самом деле, я не столкнулся с этой проблемой. Я просто не указал dbo, я думаю, что это по умолчанию на SqlServer.

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

+0

Есть ли способ добавить схему по умолчанию через код или я могу просто сделать это через xml-файл? – 2009-04-30 09:48:21

+0

Перед созданием фабрики сеансов вы можете установить все конфигурации в коде. Configuration.SetProperty ("default_catalog", значение); –

5

У нас было слишком много проблем с SQLite, что в конечном итоге побудило нас переключиться на SQL Express. Проблемы я помню:

  1. SQLite, когда используется в оперативной памяти, отбрасывает базу данных, когда сессия закрыта
  2. SQLite не поддерживает кучу SQL создает такие основные из них, как ISNULL, но и более продвинутые, как общий стол выражения и другие, добавленные в SQL 2005 и 2008. Это становится важным, когда вы начинаете писать сложные именованные запросы.
  3. Дата и время SQLite имеют больший диапазон возможных значений, чем SQL-сервер
  4. API NHibernate для SQLite ведет себя иначе, чем ADO.NET для MS SQL Server при использовании в транзакции. Одним из примеров является инструмент hbm-to-ddl, метод Execute которого не работает внутри транзакции с SQL Server, но отлично работает с SQLite.

Подводя итог, модульное тестирование на базе SQLite очень далека от того, чтобы быть окончательно репрезентативным для проблем, с которыми вы столкнетесь при использовании MS SQL Server в PROD, и, следовательно, подрывает доверие к единичному тестированию в целом.

+3

Конечно, мы будем запускать тесты на Mssql на Buildserver, на Dev-pcs мы хотели бы работать с sqlite по соображениям производительности. То, что он отбрасывает БД, является бонусом. Мы работаем в основном через nhibernate, поэтому отсутствие сложных операторов повлияет только на нас, если мы хотим получить сложные именованные запросы, или? С другой стороны: Как работает mssql-express? Могу ли я создать легко отбрасываемые dbs? – 2009-04-30 09:27:09

+0

SqlLite не отбрасывает базу данных, когда сеанс закрыт, но когда соединение закрыто. Вам нужно разделить одно соединение по всем сеансам теста. Мы можем переключать тесты с sqlite на sqlserver, переключая конфигурацию сборки. Вы также можете иметь условные тесты, которые выполняются только на sqlserver, чтобы покрыть последние 1%. –

+1

с
properties.Add ("connection.release_mode", "on_close");
NH закрывает соединение только тогда, когда сессия закрыта из первой статьи: " Исправления в конечном итоге быть довольно простым, хотя, мне просто нужно было установить мой„connection.release_mode“в положении„ON_CLOSE“, который в соответствии с nHibernate docs «оставлен для обратной совместимости, но его использование сильно обескуражено». Надеюсь, что они не удаляют это в будущей версии, потому что это вызовет несколько проблем с теми из нас, кто использует в памяти базы данных для целей тестирования ». У вас есть другое решение? – 2009-04-30 11:01:50

0

После просматривал источника NH и некоторые эксперименты я думаю, что я нашел простой обходной путь -

foreach (PersistentClass cp in configuration.ClassMappings) 
    { 
     // Input : [dbo].[Tablename] Output : Tablename 
     cp.Table.Name = Regex.Replace(cp.Table.Name, @"^\[.*\]\.\[", ""); 
     cp.Table.Name = Regex.Replace(cp.Table.Name, @"\]$", ""); 
     // just to be sure 
     cp.Table.Schema = null;     
    } 

к сведению, что я могу установить Table.Schema к нулю, а пустая строка кинул исключение ...

благодарит за ответы!