3

NHibernate を使用してデータベース内のすべてのデータを削除することは可能ですか。各単体テストを開始する前にそれを行いたいです。現在、データベースを削除して再度作成していますが、これは私にとって受け入れられる解決策ではありません。

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

わかりました、これが結果です。これをデータベース (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 秒

これ以上のテストでテストする必要はないと思います。

4

6 に答える 6

3

私はSchemaExportクラスを使用しており、各テストの前にスキーマを再作成しています。これはデータベースを削除するのとほぼ同じですが、テーブルを削除して再作成するだけです。各テーブルからすべてのデータを削除することは、これよりも高速ではなく、さらに遅くなる可能性があると思います。

通常、単体テストはメモリ内の Sqlite で実行されます。これは非常に高速です。このデータベースは、接続が開いている間のみ存在するため、テストごとにデータベース全体が再作成されます。ビルド構成を変更して、Sqlserver に切り替えます。

于 2010-07-08T07:34:19.220 に答える
2

個人的には、これを行うためにストアド プロシージャを使用しますが、Executable HQL で可能かもしれません (詳細については、この投稿を参照してください: http://fabiomaulo.blogspot.com/2009/05/nh21-executable-hql.html )

session.Delete("from object"); の行に沿ったもの

于 2010-07-09T15:39:30.780 に答える
2

これが速いとは言いませんが、マップされたクラスごとに次のようなことができます。

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

これ (単独) は、少なくとも 2 つのケースでは機能しません。

  1. アプリの起動時にデータベースに存在する必要があるデータがある場合。
  2. ID プロパティの unsaved-value が「any」である型がある場合。
于 2010-07-08T12:33:10.787 に答える
1

良い代替手段は、DB の初期状態のバックアップを取り、テストの開始時にそれを復元することです (これは、DB によって複雑になる場合とそうでない場合があります)。

于 2010-07-08T13:58:41.017 に答える
0

データベースを再作成することは、特に単体テストの場合に適しています。作成スクリプトが遅すぎる場合は、データベースのバックアップを取り、それを使用して、各テストの前にDBを初期状態に復元することができます。

別の方法は、データベース内のすべての外部キーを削除してから、すべてのテーブルを削除/切り捨てるスクリプトを作成することです。ただし、これによって自動生成されたIDまたはシーケンスがリセットされることはありません。これは洗練された解決策のようには思えず、間違いなくもっと時間がかかります。いずれにせよ、これはNHibernateだけでなく、ORMを介して実行する必要があるものではありません。

なぜ再作成オプションを拒否するのですか?あなたの要件は何ですか?スキーマが複雑すぎませんか?他の誰かがデータベースを設計していますか?ファイルの断片化を避けたいですか?

于 2010-07-08T07:35:34.450 に答える
0

別の解決策として、データをワイプするストアド プロシージャを作成することがあります。テスト セットアップまたはインスタンス化メソッドで、最初にストアド プロシージャを実行します。

ただし、データベースのサイズと削除される可能性のある行数がわからないため、これが他の方法よりも速いかどうかはわかりません。また、安全のために、このストアド プロシージャをライブ サーバーにデプロイすることはお勧めしません。

HTH

于 2010-07-09T06:22:48.997 に答える