JSONシリアル化とインメモリモードで実行されているSqliteを使用してEventStoreの永続性を単体テストしようとしています。EventStoreの初期化中に「そのようなテーブルはありません:コミット」という例外が発生します。これは、EventStoreが何らかの方法で接続を閉じて新しい接続を開き、新しいインメモリSqliteインスタンス(Sans Commitsテーブル)を認識させるためだと思います。これを機能させる方法はありますか?
1030 次
1 に答える
3
SQLiteの実装は、特に「:memory:」接続文字列を使用している場合に興味深いものです。実装を取り巻く受け入れテストは、データベースが操作間で「消えない」ことに依存します。
EventStoreの基本的な設計では、各個別のアクションを個別の操作に分割します。
- 構成に応じて、アンビエントTransactionScope(存在する場合)に参加します
- 接続を開きます
- IDbCommandを構築します
- IDbCommandを実行します
- 結果を評価します
- 接続を破棄します(プールに解放します)
- TransactionScopeを完了します(例外がスローされない場合)
- 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 に答える