Pour que mes tests d'intégration restent indépendants, j'enlève toutes les anciennes données et j'insère de nouvelles données de test avant chaque test. Existe-t-il une meilleure façon de procéder que de simplement interroger toutes les entités et de les supprimer une par une?La meilleure façon de supprimer toutes les lignes d'une table en utilisant NHibernate?
J'ai envisagé d'écrire un proc stocké qui exécute "delete from nom de table;" pour chaque table à effacer. Cela devrait être un peu plus rapide, mais ce serait bien de le faire sans faire de requêtes SQL ou d'appeler les SP via NH. J'utilise NHibernate vanille et Linq NHibernate. Je crois que Castle Active Record a quelque chose comme Foo.DeleteAll(), mais je ne veux pas utiliser Active Record pour ce projet.
Des idées?
Merci/Erik
MISE À JOUR:
Comme cette question a été posée et a répondu, des progrès ont été réalisés par l'équipe NHibernate. Comme Ayende l'explique dans this blog post, vous pouvez maintenant exécuter des requêtes DML directement, sans que NHibernate n'ait à chercher des entités.
Pour supprimer tous les Foo objets que vous pouvez faire comme ceci:
using (ISession session = ...)
using (ITransaction transaction = session.BeginTransaction())
{
session.CreateQuery("delete Foo f").ExecuteUpdate();
transaction.Commit();
}
Cette requête générerait l'instruction SQL suivante:
delete from Foo
qui Aught d'être nettement plus rapide que la récupération des entités d'abord, puis les supprimer. Attention cependant, puisque les requêtes comme celles-ci n'affectent pas le cache de niveau 1.
Si vous utilisez SQL Server, il est BEAUCOUP plus efficace d'exécuter TRUNCATE TABLE foo; 'car il s'agit d'une opération journalisée minimale. L'exécution de 'DELETE FROM foo;' enregistre toutes les suppressions à des fins de récupération; Sur les grandes tables, cela nécessite un disque/temps important. –
TRUNCATE TABLE n'est presque jamais disponible lorsqu'il y a des clés étrangères impliquées. –