3

JSONシリアル化とインメモリモードで実行されているSqliteを使用してEventStoreの永続性を単体テストしようとしています。EventStoreの初期化中に「そのようなテーブルはありません:コミット」という例外が発生します。これは、EventStoreが何らかの方法で接続を閉じて新しい接続を開き、新しいインメモリSqliteインスタンス(Sans Commitsテーブル)を認識させるためだと思います。これを機能させる方法はありますか?

4

1 に答える 1

3

SQLiteの実装は、特に「:memory:」接続文字列を使用している場合に興味深いものです。実装を取り巻く受け入れテストは、データベースが操作間で「消えない」ことに依存します。

EventStoreの基本的な設計では、各個別のアクションを個別の操作に分割します。

  1. 構成に応じて、アンビエントTransactionScope(存在する場合)に参加します
  2. 接続を開きます
  3. IDbCommandを構築します
  4. IDbCommandを実行します
  5. 結果を評価します
  6. 接続を破棄します(プールに解放します)
  7. TransactionScopeを完了します(例外がスローされない場合)
  8. TransactionScopeを破棄します

発生している問題は、EventStoreに対する各呼び出しが接続を開いたり閉じたりすることです。

同じIDbConnectionをプールに解放せずに明示的に利用することをサポートしたかったので、これを回避する方法があります。EventStore v3.0(リリース候補段階にあります)には、同じ接続を利用し、各操作後の接続の切断を回避するメソッド呼び出しがあります。

ConfigurationConnectionFactory.OpenScope("SQLite"); // SQLite = app.config connection key

これを「using_the_persistence_engine」受け入れテストクラスに追加するだけで、準備が整います。

private static IDisposable scope;

これを「コンテキストの確立」の最初の行として追加します。

scope = ConfigurationConnectionFactory.OpenScope("SQLite");

最後に、「すべてをクリーンアップする」の最後の行は次のようになります。

scope.Dispose();
于 2011-10-28T11:42:37.700 に答える