Для обеспечения независимости моих интеграционных тестов я удаляю все старые данные и вставляю новые тестовые данные перед каждым тестом. Есть ли лучший способ сделать это, чем просто запросить все объекты и удалить их один за другим?
Я рассмотрел написание хранимого процесса, который запускает "delete from tablename ;" для каждой таблицы, которая должна быть очищена. Это должно быть немного быстрее, но было бы неплохо сделать это без выполнения SQL-запросов или вызова SP через NH.
Я использую ванильный NHibernate и Linq для NHibernate. Я считаю, что у Castle Active Record есть что-то вроде Foo.DeleteAll (), но я не хочу использовать Active Record для этого проекта.
Есть идеи?
Спасибо / Эрик
UPDATE:
Поскольку этот вопрос был задан и получен ответ, команда NHibernate достигла прогресса. Как объясняет Айенде в этом сообщении в блоге , теперь вы можете напрямую выполнять запросы DML без необходимости извлечения каких-либо сущностей NHibernate.
Чтобы удалить все объекты Foo, вы можете сделать это так:
using (ISession session = ...)
using (ITransaction transaction = session.BeginTransaction())
{
session.CreateQuery("delete Foo f").ExecuteUpdate();
transaction.Commit();
}
Этот запрос будет генерировать следующий SQL:
delete from Foo
, что должно быть значительно быстрее, чем сначала извлекать сущности, а затем удалять их. Однако будьте осторожны, поскольку подобные запросы не влияют на кэш 1-го уровня.