nhibernateですべてのデータベースデータを削除する方法
-
12-09-2020 - |
質問
==========================================================================================================================================================================================================================================================」である==========
OK、ここに結果があります。データベース(Postgre)でテストしています。CreateSchema(1)、DANPソリューション(2)とApolloDude217の解決策(3)をテストします。私はテストを各方法で5回実行し、平均時間を取ってください。
ラウンド1 - 10テスト
(1) - ~26秒
(2) - 9,0秒
(3) - 9,3秒
ラウンド2 - 100テスト
(1) - やってくる、私は自分のマシンではできません
(2) - 12,6秒
(3) - 18,6秒
私はより多くのテストでテストする必要がないと思います。
解決
個人的には、これを行うためにストアドプロシージャを使用しますが、実行可能HQLでは可能ですが、詳細についてはこの記事を参照してください。 http://fabiomaulo.blogspot.com/2009/05/NH21-executable-hql.html
他のヒント
SchemaExport
クラスを使用していて、各テストの前にスキーマを再作成しています。これはデータベースをドロップするのとほとんどのようなものですが、テーブルを削除して再作成しています。私は各テーブルからすべてのデータを削除することがこれに早くされていないと仮定します、それは遅くなる可能性さえあります。
私たちのユニットテストは通常メモリ内のSQLiteで実行されていますが、これは非常に速いです。このデータベースは接続が開いている限りだけ存在しますので、データベース全体はテストごとに再作成されます。ビルド構成を変更することでSQLServerに切り替えています。
これが早く請求されていませんが、マップされた各クラスごとにこのようなことをすることができます。
// untested
var entities = MySession.CreateCriteria(typeof(MappedClass)).List<MappedClass>();
foreach(var entity in entities)
MySession.Delete(entity); // please optimize
.
これ(単独)ではなく、少なくとも2つのケースで作業していません。
- アプリが起動したときにデータベースに含まれる必要があるデータがある場合
- Identityプロパティの未保存値が "any"のタイプがある場合は
良い選択肢は、初期DB状態のバックアップを持ち、テスト開始時に復元している(DBに応じて、これは複雑になる可能性があります)
です。データベースの再作成は、特に単体テストのための良い選択です。作成スクリプトが遅すぎる場合は、データベースのバックアップを実行し、それを使用して各テストの前にDBを初期状態に復元できます。
代替案は、データベース内のすべての外部キーを削除するスクリプトを作成することです。その後、すべてのテーブルを削除/切り捨てます。ただし、これは自動生成IDまたはシーケンスをリセットしません。これはエレガントな解決策のようには見えません、そしてそれは間違いなく時間がかかるのです。 いずれにせよ、これは、NHIBERNETだけでなく、ORMを通して行われるべきものではありません。
再作成オプションを拒否しますか?あなたの要求は何ですか?スキーマは複雑すぎますか?他の誰かがデータベースをデザインしますか?ファイルの断片化を避けますか?
別の解決策は、データを払拭するストアドプロシージャを作成することです。テストセットアップまたはインスタンス化メソッドが最初にストアドプロシージャを実行します。
しかし、データベースのサイズと削除される可能性がある行数がわからないため、これが他の方法のいずれかより速いかどうかはわかりません。また、安全上の目的でこのストアドプロシージャーをライブサーバーにデプロイすることをお勧めしません。
hth