nhibernate - tablas - como insertar y eliminar filas y columnas en word
¿La mejor manera de eliminar todas las filas en una tabla usando NHibernate? (3)
Con NHibernate 5.0 ahora puedes simplemente hacer:
session.Query<Foo>().Delete();
Documentación:
//
// Summary:
// Delete all entities selected by the specified query. The delete operation is
// performed in the database without reading the entities out of it.
//
// Parameters:
// source:
// The query matching the entities to delete.
//
// Type parameters:
// TSource:
// The type of the elements of source.
//
// Returns:
// The number of deleted entities.
public static int Delete<TSource>(this IQueryable<TSource> source);
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?
Consideré escribir un proceso almacenado que ejecuta "delete from 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.
¿Algunas ideas?
Gracias / Erik
ACTUALIZAR:
Dado que esta pregunta fue hecha y respondida, el equipo de NHibernate ha realizado progresos. Como explica Ayende en esta publicación de blog , ahora puede ejecutar consultas DML directamente, sin que NHibernate tenga que buscar entidades.
Para eliminar todos los objetos Foo, puedes hacer esto:
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
que debe ser significativamente más rápido que buscar las entidades primero y luego eliminarlas. Tenga cuidado, ya que consultas como estas no afectan el nivel 1 de la caché.
En el TearDown de mis UnitTests, principalmente hago esto:
using( ISession s = ... )
{
s.Delete ("from Object o");
s.Flush();
}
Esto debería eliminar todas las entidades. Si desea eliminar todas las instancias de una entidad específica, puede hacer esto:
using( ISession s = .... )
{
s.Delete ("from MyEntityName e");
s.Flush();
}
Por supuesto, hay un inconveniente con este método, y es que NHibernate primero buscará las entidades antes de eliminarlas.
Uso los atributos de Fibrent Nhibernate, así que modifico un poco el código para no llamar a los nombres de las tablas hardcore
private static void CleanUpTable<T>(ISessionFactory sessionFactory)
{
var metadata = sessionFactory.GetClassMetadata(typeof(T)) as NHibernate.Persister.Entity.AbstractEntityPersister;
string table = metadata.TableName;
using (ISession session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
string deleteAll = string.Format("DELETE FROM /"{0}/"", table);
session.CreateSQLQuery(deleteAll).ExecuteUpdate();
transaction.Commit();
}
}
}
uso
CleanUpTable<Person>(sessionFactory);