37 votes

Meilleure façon de supprimer toutes les lignes d'une table à l'aide de NHibernate?

Pour garder mes tests d'intégration indépendant, j'ai enlever toutes les anciennes données et insérer de nouvelles données de test avant chaque test. Est-il une meilleure façon de le faire plus simplement à la recherche de toutes les entités et de les supprimer un par un?

J'ai envisagé d'écrire une procédure stockée qui s'exécute "delete from nom_table;" pour chaque table qui doit être effacé. Qui devrait un peu plus rapide, mais il serait bien de le faire sans faire des requêtes SQL ou en appelant le SPs via NH.

Je suis l'aide de vanille NHibernate et Linq to NHibernate. Je crois Château Active Record a quelque chose comme Toto.DeleteAll(), mais je ne veux pas Active Record pour ce projet.

Des idées?

Merci /Erik

Mise à JOUR:

Depuis que cette question a été posée et répondue, des progrès ont été accomplis par le NHibernate de l'équipe. Comme Ayende explique dans ce billet de blog, vous pouvez maintenant exécuter des requêtes DML directement, sans NHibernate avoir à l'extraction des entités.

Pour supprimer tous les Foo objets que vous pourriez faire comme ceci:

using (ISession session = ...)
using (ITransaction transaction = session.BeginTransaction())
{
    session.CreateQuery("delete Foo f").ExecuteUpdate();

    transaction.Commit();
}

Cette requête devrait générer le code SQL suivant:

delete from Foo

qui promet d'être nettement plus rapide que d'aller chercher les entités d'abord et ensuite de les supprimer. Attention tout de même, puisque les requêtes comme elles n'affectent pas le niveau 1 de cache.

33voto

Frederik Gheysels Points 36354

Dans le Démontage de mon UnitTests, j'ai surtout cela:

using( ISession s = ... )
{
   s.Delete ("from Object o");
   s.Flush();
}

Cela devrait supprimer toutes les entités. Si vous souhaitez supprimer toutes les occurrences d'une entité spécifique, vous pouvez faire ceci:

using( ISession s = .... )
{
    s.Delete ("from MyEntityName e");
    s.Flush();
}

Offcourse, il y a un inconvénient de cette méthode, c'est que NHibernate va d'abord chercher les entités avant de les supprimer.

12voto

Lu55 Points 2339

J'utilise Couramment Nhibernate attributs donc j'ai modifier le code un peu, afin de ne pas hardcore noms de table

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

l'utilisation de la

CleanUpTable<Person>(sessionFactory);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X