una tablas tabla renglones linea insertar filas eliminar contenido como combinar columnas celdas cambio borrar ancho nhibernate stored-procedures linq-to-nhibernate

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);