Question

Est-il possible de supprimer toutes les données dans la base de données à l'aide de NHibernate.Je veux le faire avant le début de chaque test unitaire.Actuellement, je baisse ma base de données et créer à nouveau, mais ce n'est pas acceptable pour moi, la solution.

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

Ok, voici les résultats.Je suis en train de tester cela sur une base de données (Postgre).Je vais tester CreateSchema(1), DanP solution de(2) et apollodude217 solution de(3).J'exécute les tests 5 fois avec chaque méthode et de prendre le temps moyen.

Ronde 1 - 10 tests
(1) - ~26 sec
(2) - 9,0 sec
(3) - 9,3 sec

Ronde 2 - les tests de 100
(1) - allez, je ne vais pas le faire sur ma machine
(2) - 12,6 sec
(3) - 18,6 sec

Je pense qu'il n'est pas nécessaire de tester avec plus de tests.

Était-ce utile?

La solution

Personnellement, j'utilise une procédure stockée pour le faire, mais il peut être possible avec un HQL exécutable (voir cet article pour plus de détails: http://fabiomaulo.blogspot.com/2009/05/nh21-executable-haql.html )

quelque chose sur les lignes de session.Delete ("de l'objet");

Autres conseils

Je suis à l'aide de la SchemaExport de la classe et de recréer le schéma avant chaque test.C'est presque comme abandon de la base de données, mais c'est seulement à la baisse et de recréer les tables.Je suppose que la suppression de toutes les données de chaque table n'est pas plus rapide que cela, elle pourrait même être plus lent.

Nos tests unitaires sont généralement en cours d'exécution sur Sqlite en mémoire, c'est très rapide.Cette base de données n'existe que tant que la connexion est ouverte, de sorte que l'ensemble de la base de données est recréé pour chaque test.Nous sommes de commutation pour Sqlserver par la modification de la configuration de build.

Je ne prétends pas que cela est plus rapide, mais vous pouvez faire quelque chose comme ceci pour chaque classe mappée:

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

Ce (seul) sera pas travailler dans au moins 2 cas:

  1. Lorsqu'il y a des données qui doivent figurer dans votre base de données lorsque l'application démarre.
  2. Lorsque vous avez un type où la valeur non enregistrée de la propriété identitaire est "Toute".

Une bonne alternative consiste à une copie de l'état DB initial et à le restaurer lors du démarrage des tests (cela peut être complexe ou non, en fonction du dB)

La création de la base de données est un bon choix, en particulier pour les tests d'unités.Si le script de création est trop lent, vous pouvez prendre une sauvegarde de la base de données et l'utiliser pour restaurer la DB à un état initial avant chaque test.

L'alternative serait d'écrire un script qui supprimerait toutes les clés étrangères de la base de données puis supprimer / tronquer toutes les tables.Cela ne réinitialiserait cependant aucun ID ou séquences autogogenérées.Cela ne semble pas être une solution élégante et il suffit de prendre plus de temps. Dans tous les cas, ce n'est pas quelque chose qui devrait être fait à travers un orj, pas seulement NHibernate.

Pourquoi rejetez-vous l'option de reconstitution?Quelles sont vos exigences?Le schéma est-il trop complexe?Est-ce que quelqu'un d'autre conçoit la base de données?Voulez-vous éviter la fragmentation de fichier?

Une autre solution peut être de créer une procédure stockée qui supprime les données.Dans votre installation de test ou votre méthode d'instanciate exécutez d'abord la procédure stockée.

Cependant, je ne suis pas sûr que cela soit plus rapide que l'une des autres méthodes que nous ne connaissons pas la taille de la base de données et le nombre de lignes susceptibles d'être supprimés.De plus, je ne recommanderais pas de déployer cette procédure stockée sur le serveur en direct à des fins de sécurité!

htth

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top