私のWebアプリケーションでは、リクエストサイクルのどこかで、リポジトリの次のメソッドを呼び出します。
repository.Delete(objectToDelete);
これはNHibernateの実装です。
public void Delete(T entity)
{
if (!session.Transaction.IsActive)
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Delete(entity);
transaction.Commit();
}
}
else
{
session.Delete(entity);
}
}
そして、session.Delete(entity)(usingステートメント内)が失敗します-これは問題ありません。データベースにいくつかの制約があり、これは私が期待していたことです。ただし、Global.asax.csでのリクエストの最後に、次のコードでセッションを閉じます。
protected void Application_EndRequest(object sender, EventArgs e)
{
ISession session = ManagedWebSessionContext.Unbind(HttpContext.Current, sessionFactory);
if (session != null)
{
if (session.Transaction != null && session.Transaction.IsActive)
{
session.Transaction.Rollback();
}
else
{
session.Flush();
}
session.Close();
}
}
これは、オブジェクトの削除に使用されたのと同じセッションです。そして今、いつ:
session.Flush();
が呼び出されると、NHibernateは同じDELETE操作を実行しようとします。これにより、例外がスローされ、アプリケーションがクラッシュします。以前に(リポジトリレベルで)例外を処理したことがあり、preety UIメッセージボックスを表示しているため、正確には私が望んでいたものではありません。
そのsession.Flushが呼び出されたときに、NHibernateがDELETE(および他のシナリオではUPDATE操作を推測する)アクションを再度実行しようとするのを防ぐにはどうすればよいですか?Basicall私はそのApplication_EndRequestを設計していないので、それがすべてをフラッシュするための良いアプローチであるかどうかはわかりません。
ありがとう