Использование Sqlite InMemory DB для модульного тестирования MSSQL-DB - PullRequest
4 голосов
/ 30 апреля 2009

Я пытаюсь реализовать это решение: NHibernate-20-SQLite-и-In-Memory-БД

Единственная проблема в том, что у нас есть hbms как это:

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

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

Я нашел эту публикацию в группе 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 сейчас невозможно)?

Ответы [ 3 ]

7 голосов
/ 30 апреля 2009

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

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

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

1 голос
/ 30 апреля 2009

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

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

0 голосов
/ 30 апреля 2009

После просмотра источника 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 на ноль, в то время как пустая строка вызвала исключение ...

спасибо за ответы!

...