Para mantener mis pruebas de integración independientes, elimino todos los datos antiguos e inserto nuevos datos de prueba antes de cada prueba. ¿Hay una forma mejor de hacer esto que simplemente consultar todas las entidades y eliminarlas una por una?¿La mejor manera de borrar todas las filas en una tabla usando NHibernate?
He considerado escribir un proceso almacenado que ejecuta "eliminar de tablename;" para cada tabla que se va a borrar. Eso debería ser un poco más rápido, pero sería bueno hacerlo sin hacer consultas SQL o llamar a SP a través de NH.
Estoy usando vainilla NHibernate y Linq para NHibernate. Creo que Castle Active Record tiene algo así como Foo.DeleteAll(), pero no quiero usar Active Record para este proyecto.
¿Alguna idea?
Gracias/Erik
ACTUALIZACIÓN:
Dado que esta cuestión se le preguntó y respondió, se ha avanzado por el equipo de NHibernate. Como explica Ayende en this blog post, ahora puede ejecutar consultas DML directamente, sin que NHibernate tenga que buscar entidades.
Para eliminar objetos que podría hacer así todo Foo:
using (ISession session = ...)
using (ITransaction transaction = session.BeginTransaction())
{
session.CreateQuery("delete Foo f").ExecuteUpdate();
transaction.Commit();
}
Esta consulta generaría el siguiente SQL:
delete from Foo
el que nada a ser significativamente más rápido que ir a buscar las entidades primera y luego eliminándolos. Tenga cuidado, ya que consultas como estas no afectan el nivel 1 de la caché.
Si está utilizando SQL Server, es MUCHO más eficiente ejecutar 'TRUNCATE TABLE foo;' ya que es una operación mínimamente registrada. Ejecutando 'DELETE FROM foo;' registra todas las eliminaciones para fines de recuperación; en tablas grandes esto requiere un disco/tiempo significativo. –
TRUNCATE TABLE casi nunca está disponible cuando hay claves foráneas involucradas. –