Pregunta

Es posible borrar todos los datos en la base de datos usando NHibernate.Yo quiero hacer lo que antes de iniciar cada unidad de prueba.Actualmente puedo dejar a mi base de datos y crear de nuevo, pero esta no es la solución aceptable para mí.

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

Ok, aquí están los resultados.Estoy probando esto en una base de datos (Postgre).Voy a probar CreateSchema(1), DanP solución de(2) y apollodude217 solución de(3).Ejecutar las pruebas de 5 veces con cada método y tomar el promedio de tiempo.

Ronda 1 - 10 pruebas
(1) - ~26 seg.
(2) - 9,0 sec
(3) - 9,3 sec

Ronda 2 - 100 pruebas
(1) - Venga, no voy a hacer eso en mi máquina
(2) - 12,6 sec
(3) - 18,6 sec

Creo que no es necesario probar con más pruebas.

¿Fue útil?

Solución

Personalmente, utilizo un procedimiento almacenado para hacer esto, pero puede ser posible con HQL ejecutable (consulte esta publicación para más detalles: http://fabiomaulo.blogspot.com/2009/05/nh21-executable-hql.html )

algo a lo largo de las líneas de la sesión. Delete ("del objeto");

Otros consejos

Estoy usando el SchemaExport clase y recrear el esquema antes de cada prueba.Esto es casi como quitar la base de datos, pero sólo de caer y volver a crear las tablas.Supongo que la eliminación de todos los datos de cada tabla no es más rápido que este, que incluso podría ser más lento.

Nuestra unidad de pruebas normalmente se ejecutan en Sqlite en la memoria, esto es muy rápido.Esta base de datos sólo existe mientras la conexión está abierta, por lo que el conjunto de la base de datos es crear para cada prueba.Estamos cambiando a Sqlserver cambiando la configuración de generación.

No reclamo que esto es más rápido, pero puede hacer algo como esto para cada clase asignada:

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

Este (solo) no será trabajo en al menos 2 casos:

  1. Cuando hay datos que deben estar en su base de datos cuando se inicie la aplicación.
  2. Cuando tiene un tipo donde el valor no guardado de la propiedad de identidad es "cualquiera".

Una buena alternativa es tener una copia de seguridad del estado inicial de DB y restaurarlo al iniciar pruebas (esto puede ser complejo o no, dependiendo de la DB)

Re-creación La base de datos es una buena opción, especialmente para las pruebas de la unidad.Si el script de creación es demasiado lento, podría tomar una copia de seguridad de la base de datos y usarla para restaurar el DB a un estado inicial antes de cada prueba.

La alternativa sería escribir un script que eliminaría todas las teclas externas en la base de datos, eliminar / truncar todas las tablas.Esto no restablecería ninguna identificación o secuencias autogeneradas.Esto no parece una solución elegante y definitivamente requiere más tiempo. En cualquier caso, esto no es algo que se debe hacer a través de un ORM, no solo nhibernate.

¿Por qué rechazas la opción de recreación?¿Cuáles son sus requisitos?¿Es el esquema demasiado complejo?¿Alguien más diseña la base de datos?¿Quieres evitar la fragmentación de archivos?

Otra solución podría ser crear un procedimiento almacenado que limpie los datos.En su prueba de prueba o método de instancia, ejecute primero el procedimiento almacenado.

Sin embargo, no estoy seguro de si esto es más rápido que cualquiera de los otros métodos, ya que no conocemos el tamaño de la base de datos y el número de filas que probablemente se eliminen.¡También no recomendaría la implementación de este procedimiento almacenado al servidor en vivo para fines de seguridad!

hth

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top