Frage

Ist es möglich, alle Daten in der Datenbank mit NHibernate zu löschen?Ich möchte das tun, bevor ich mit jedem Unit-Test beginne.Derzeit lösche ich meine Datenbank und erstelle sie erneut, aber das ist für mich keine akzeptable Lösung.

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

Ok, hier sind die Ergebnisse.Ich teste dies in einer Datenbank (Postgre).Ich werde CreateSchema(1), DanP-Lösung(2) und apollodude217-Lösung(3) testen.Ich führe die Tests mit jeder Methode fünfmal durch und nehme die durchschnittliche Zeit.

Runde 1 – 10 Tests
(1) – ~26 Sek
(2) - 9,0 Sek
(3) - 9,3 Sek

Runde 2 – 100 Tests
(1) – Komm schon, das werde ich auf meiner Maschine nicht machen
(2) - 12,6 Sek
(3) - 18,6 Sek

Ich denke, dass es nicht notwendig ist, weitere Tests durchzuführen.

War es hilfreich?

Lösung

Ich persönlich, ich verwende eine gespeicherte Prozedur dazu, dies kann jedoch mit ausführbarer HQL möglich sein (siehe diesen Beitrag Weitere Details: http://fabiomaulo.blogspot.com/2009/05/nh21-Extekable-hql.html )

etwas entlang der Session-Linien .Delete ("vom Objekt");

Andere Tipps

Ich verwende das SchemaExport Klasse und erstellen Sie das Schema vor jedem Test neu.Das ist fast so, als würde man die Datenbank löschen, aber es geht nur darum, die Tabellen zu löschen und neu zu erstellen.Ich gehe davon aus, dass das Löschen aller Daten aus jeder Tabelle nicht schneller ist, sondern sogar langsamer.

Unsere Unit-Tests laufen normalerweise auf SQLite im Speicher, das ist sehr schnell.Diese Datenbank existiert nur, solange die Verbindung geöffnet ist, sodass die gesamte Datenbank für jeden Test neu erstellt wird.Wir wechseln zu Sqlserver, indem wir die Build-Konfiguration ändern.

Ich behaupte das nicht schneller, aber Sie können für jede zugeordnete Klasse so etwas tun:

generasacodicetagpre.

Dieser (allein) wird in mindestens 2 Fällen nicht funktionieren:

    .
  1. Wenn Daten vorhanden sind, die sich in Ihrer Datenbank befinden müssen, wenn die App aufläuft.
  2. Wenn Sie einen Typ haben, in dem der nicht gespeicherte Wert der Identity-Eigenschaft "beliebigt" ist.

Eine gute Alternative hat eine Sicherung des anfänglichen DB-Zustands und wiederherzustellen, wenn Sie Tests starten (dies kann in Abhängigkeit von dB)

komplex sein oder nicht.

Neuen Erstellen der Datenbank ist eine gute Wahl, insbesondere für die Untersuchung des Geräts.Wenn das Erstellungsskript zu langsam ist, können Sie eine Sicherung der Datenbank annehmen und verwenden, um den DB vor jedem Test in einen Anfangszustand wiederherzustellen.

Die Alternative wäre, ein Skript zu schreiben, das alle Fremdschlüssel in der Datenbank ablegen würde, dann alle Tabellen löschen / abschneiden.Dies würde jedoch keine automatisch genannten IDs oder Sequenzen zurücksetzen.Dies scheint nicht wie eine elegante Lösung und es ist definitiv mehr zeitaufwändig. In jedem Fall sollte dies nicht etwas, das durch ein Orm erfolgen sollte, nicht nur nhibernes.

Warum lehnst du die Option Re-Creation ab?Was sind Ihre Anforderungen?Ist das Schema zu komplex?Entwirft jemand anderes die Datenbank?Möchten Sie eine Dateifragmentierung vermeiden?

Eine andere Lösung kann sein, um eine gespeicherte Prozedur zu erstellen, die die Daten wischt.Führen Sie in Ihrer Test-Setup- oder Instantiate-Methode zuerst die gespeicherte Prozedur aus.

Ich bin jedoch nicht sicher, ob dies schneller ist als jeder der anderen Methoden, da wir nicht die Größe der Datenbank und die Anzahl der Zeilen, die wahrscheinlich gelöscht werden sollen, nicht wissen.Ich würde auch nicht empfehlen, diese gespeicherte Prozedur zum Live-Server für Sicherheitszwecke bereitzustellen!

hth

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top