Как удалить все данные базы данных с помощью NHibernate?

StackOverflow https://stackoverflow.com/questions/3201445

Вопрос

Можно ли удалить все данные в базе данных с помощью NHibernate?Я хочу сделать это перед началом каждого модульного теста.В настоящее время я удаляю свою базу данных и создаю ее снова, но это неприемлемое решение для меня.

==========================================================

Итак, вот результаты.Я тестирую это на базе данных (Postgre).Я протестирую CreateSchema (1), решение DanP (2) и решение apollodude217 (3).Я провожу тесты по 5 раз с каждым методом и беру среднее время.

Раунд 1 - 10 тестов
(1) - ~26 сек.
(2) - 9,0 сек.
(3) - 9,3 сек.

Раунд 2 - 100 тестов
(1) - Да ладно, я не буду этого делать на своей машине
(2) - 12,6 с
(3) - 18,6 сек.

Я думаю, что нет необходимости тестировать с помощью дополнительных тестов.

Это было полезно?

Решение

Лично я использую сохраненную процедуру для этого, но это возможно с исполняемым hql (см. Это сообщение для более подробной информации: http://fabiomaulo.blogspot.com/2009/05/nh21-executable-hql.html )

что-то вдоль строк сеанса. Доставка ("от объекта");

Другие советы

Я использую SchemaExport создавайте класс и заново создавайте схему перед каждым тестированием.Это почти как удаление базы данных, но это всего лишь удаление и воссоздание таблиц заново.Я предполагаю, что удаление всех данных из каждой таблицы происходит не быстрее, чем это, это может быть даже медленнее.

Наши модульные тесты обычно выполняются на Sqlite в памяти, это очень быстро.Эта база данных существует только до тех пор, пока открыто соединение, поэтому для каждого теста воссоздается вся база данных.Мы переключаемся на Sqlserver, изменяя конфигурацию сборки.

Я не претендую, это быстрее, но вы можете сделать что-то подобное для каждого сопоставления класса:

// untested
var entities = MySession.CreateCriteria(typeof(MappedClass)).List<MappedClass>();
foreach(var entity in entities)
    MySession.Delete(entity);  // please optimize
.

Это (в одиночку) будет не работать не менее 2 случаев:

  1. Когда есть данные, которые должны быть в вашей базе данных, когда приложение запускается.
  2. , когда у вас есть тип, где невнастроенное значение идентичности является «любой».

Хорошая альтернатива имеет резервную копию исходного состояния БД и восстановление его при запуске тестов (это может быть сложным или нет, в зависимости от DB)

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

Альтернативой будет написать скрипт, который отбросит все внешние ключей в базе данных, затем удалить / усечить все таблицы.Это не будет сбросить никаких аутогенерационных идентификаторов или последовательностей.Это не похоже на элегантное решение, и это определенно больше времени потребляет. В любом случае, это не то, что должно быть сделано через ORM, а не только Nibernate.

Почему вы отклоните опцию повторного создания?Каковы ваши требования?Схема слишком сложная?Кто-то другой дизайн базы данных?Вы хотите избежать фрагментации файлов?

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

Однако я не уверен, если это быстрее, чем любой из других методов, поскольку мы не знаем размер базы данных и количество строк, которые могут быть удалены.Также я не рекомендую развертывать эту сохраненную процедуру на живой сервер для целей безопасности!

HTH

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top