これは実際には私の側の大きな見落としでした。私のエンティティはすべてネイティブ ID 生成を使用していたため、トランザクションをフラッシュしたことがなくても、保存時に挿入されました。(ルールの例外。この優れた説明を参照してください: https://stackoverflow.com/a/43567/1015595 )
一方、Member エンティティは ID を Guid にマップします。その場合、オブジェクトは期待どおりに動作し、トランザクションがフラッシュされるまで保持されません。
オスカーが彼の答えで言ったように、何かを保存しようとする前にトランザクションを開始し、後でトランザクションをコミットする必要があります。保存を try-catch ステートメントでラップすることをお勧めします。
// Adds sample data to our database
public ActionResult Seed()
{
...
StoreRepository.BeginTransaction();
try
{
StoreRepository.SaveOrUpdateAll( barginBasin, superMart );
StoreRepository.Commit();
return RedirectToAction( "Index" );
}
catch
{
StoreRepository.Rollback();
return RedirectToAction( "Error" );
}
}
リポジトリに追加する必要があるメソッドは次のとおりです。
public void BeginTransaction()
{
Session.BeginTransaction();
}
public void Commit()
{
Session.Transaction.Commit();
}
public void Rollback()
{
Session.Transaction.Rollback();
}
これらのメソッドをリポジトリに保持して、コントローラーをテスト可能な状態に保つ必要があります。
その記事を書いたとき、私は NH トランザクションについて何も知りませんでした。私をつまずかせたのは、ウィンザー城のドキュメントの次の部分でした。
今行ったことの目に見えない効果ですが、重要な点が 1 つあります。コンポーネントを登録することで、Windsor にコンポーネントの作成方法を指示しただけではありません。また、Windsor はインスタンスの適切な破棄も処理してくれるので、インスタンスの完全なライフタイムを管理してくれます。簡単に言うと、Windsor は、使用されなくなった両方のオブジェクトを破棄します。これは、ISession に加えた変更をデータベースにフラッシュし、ISessionFactory をクリーンアップすることを意味します。そして、これらすべてを無料で入手できます。
あなたが私に尋ねると、かなり誤解を招く。