Как удалить все данные базы данных с помощью NHibernate?
-
12-09-2020 - |
Вопрос
Можно ли удалить все данные в базе данных с помощью 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 случаев:
- Когда есть данные, которые должны быть в вашей базе данных, когда приложение запускается.
- , когда у вас есть тип, где невнастроенное значение идентичности является «любой».
Хорошая альтернатива имеет резервную копию исходного состояния БД и восстановление его при запуске тестов (это может быть сложным или нет, в зависимости от DB)
Повторное создание базы данных - хороший выбор, особенно для тестирования подразделения.Если сценарий создания слишком медленнее, вы можете сделать резервную копию базы данных и использовать его, чтобы восстановить дБ в исходное состояние перед каждым тестом.
Альтернативой будет написать скрипт, который отбросит все внешние ключей в базе данных, затем удалить / усечить все таблицы.Это не будет сбросить никаких аутогенерационных идентификаторов или последовательностей.Это не похоже на элегантное решение, и это определенно больше времени потребляет. В любом случае, это не то, что должно быть сделано через ORM, а не только Nibernate.
Почему вы отклоните опцию повторного создания?Каковы ваши требования?Схема слишком сложная?Кто-то другой дизайн базы данных?Вы хотите избежать фрагментации файлов?
Другое решение может быть создание хранимой процедуры, которая вытирает данные.В вашем испытательном настроении или инстанционном методе сначала запустите сохраненную процедуру.
Однако я не уверен, если это быстрее, чем любой из других методов, поскольку мы не знаем размер базы данных и количество строк, которые могут быть удалены.Также я не рекомендую развертывать эту сохраненную процедуру на живой сервер для целей безопасности!
HTH