Come eliminare tutti i dati del database con Nibernate?
-
12-09-2020 - |
Domanda
È possibile eliminare tutti i dati nel database utilizzando Nibernate.Voglio farlo prima di iniziare ogni test dell'unità.Attualmente cado il mio database e lo creò di nuovo ma questa non è una soluzione accettabile per me.
==========================================================
OK, ecco i risultati.Sto testando questo su un database (postgre).Testerò Createschema (1), Soluzione DANP (2) e Soluzione ApolloDude217 (3).Eseguo i test 5 volte con ogni metodo e prendi il tempo medio.
Round 1 - 10 test
(1) - ~ 26 sec
(2) - 9,0 sec
(3) - 9,3 sec
TOVS ROUND 2 - 100
(1) - Dai, non lo farò sulla mia macchina
(2) - 12,6 sec
(3) - 18,6 sec
Penso che non sia necessario testare con più test.
Soluzione
Personalmente, uso una procedura memorizzata per farlo, ma potrebbe essere possibile con HQL eseguibile (vedere questo post per maggiori dettagli: http://fabiomaulo.blogspot.com/2009/05/NH21-Executable-hql.html )
Qualcosa lungo le linee di sessione.Delete ("Object Object");
Altri suggerimenti
Sto usando la classe SchemaExport
e ricreare lo schema prima di ogni test.Questo è quasi come far cadere il database, ma è solo caduta e ricreando le tabelle.Suppongo che l'eliminazione di tutti i dati da ciascuna tabella non sia più veloce, allora potrebbe anche essere più lento.
I nostri test dell'unità sono solitamente in esecuzione su SQLite in memoria, questo è molto veloce.Questo database esiste solo finché la connessione è aperta, quindi l'intero database viene ricreato per ogni test.Stiamo passando a SQLServer modificando la configurazione di build.
Non reclamo più veloce, ma puoi fare qualcosa del genere per ogni classe mappata:
// untested
var entities = MySession.CreateCriteria(typeof(MappedClass)).List<MappedClass>();
foreach(var entity in entities)
MySession.Delete(entity); // please optimize
.
Questo (solo) sarà non funziona in almeno 2 casi:
- .
- Quando ci sono dati che devono essere nel database quando l'app si avvia.
- Quando hai un tipo in cui il valore non salvato della proprietà dell'identità è "qualsiasi".
Una buona alternativa è avere un backup dello stato DB iniziale e ripristinandolo quando i test iniziali (questo può essere complesso o meno, a seconda del DB)
Re-creazione del database è una buona scelta, specialmente per il test dell'unità.Se lo script di creazione è troppo lento, è possibile effettuare un backup del database e utilizzarlo per ripristinare il DB in uno stato iniziale prima di ogni test.
L'alternativa sarebbe quella di scrivere uno script che eseguirebbe tutti i tasti estranei nel database quindi eliminare / troncare tutte le tabelle.Questo non resetterà comunque alcun ID o sequenze autogenerati.Questo non sembra una soluzione elegante ed è sicuramente più che richiede tempo. In ogni caso, questo non è qualcosa che dovrebbe essere fatto attraverso un orm, non solo nibernate.
Perché rifiuta l'opzione di ri-creazione?Quali sono le tue esigenze?Lo schema è troppo complesso?Qualcun altro progetta il database?Vuoi evitare la frammentazione dei file?
Un'altra soluzione potrebbe essere quella di creare una stored procedure che pulisce i dati.Nell'integrazione del test o nel metodo istanziato eseguire prima la procedura memorizzata.
Comunque non sono sicuro se questo è più veloce di uno qualsiasi degli altri metodi in quanto non conosciamo la dimensione del database e il numero di righe che potrebbero essere cancellati.Inoltre non consiglierei la distribuzione di questa procedura memorizzata al server live per scopi di sicurezza!
HTH