sqlite DBでnhibernateを使用してc#で記述されたアプリがあります。ユニットテストには、xunitとインメモリsqliteデータベースを使用しています。
セッションが閉じられるとメモリ内DBが破棄されることを認識しているため、テストでは単一のセッションを使用し、テストの間は開いたままにします。私のテストのほとんどでは、これは正常に機能します。
ただし、いくつかのケースでは、との両方を使用するメソッドをテストする必要がISession
ありIStatelessSession
ます。少し調べた後、私はここで説明したアプローチに似たものに落ち着きました。したがって、は次のような'接続IStatelessSession
を使用して作成されます。ISession
statelessSession = factory.OpenStatelessSession(existingSession.Connection);
問題は、変更がDBに永続化されるとすぐに、これが何らかの競合を引き起こすように見えることです。でトランザクションを実行すると問題ありませんが、トランザクションを実行session.SaveOrUpdate(new Entity() {...})
するstatelessSession.Get<Entity>(1)
と、「コレクションはどのセッションにも関連付けられていません」というエラーメッセージが表示されて失敗します。
通常、このエラーはセッションが閉じていることを示しますが、この場合、両方のセッションはまだ開いていてアクティブです。
そうするとsession.Get<Entity>(1)
、期待どおりにエンティティが返されます。当初、これはセッションとステートレスセッションが何らかの理由で同期していないことが原因である可能性があると考えたため、テストを置き換えsession.SaveOrUpdate..
て再実行しました。statelessSession.Insert(new Entity() {...})
不思議なことに、これは何の違いもありませんでした。通常のセッションは引き続き正常に機能し、statelessSessionは引き続き壊れています。