0


0

Castle Active Recordの FindAllByProperty`が OnUpdate`を呼び出すのはなぜですか?

「FindAllByProperty」を呼び出すと、キャッスルアクティブレコードで「OnUpdate」が呼び出されます。インスタンスの「OnUpdate」で重複チェックを行うため、スタックオーバーフローが発生します。 次のコードを検討してください。 なぜ `OnUpdate`を呼び出すのですか? どうすれば止めることができますか?

protected override void OnUpdate()
{
    if (FindAllByProperty("Title", this.Title).Length > 1)
        throw new Exception("duplicate Message in update");

    base.OnUpdate();
}

1 Answer


2


おそらく何が起こっているのでしょう:

  1. アプリの何かがセッションをフラッシュします。

  2. フラッシュ中、NHibernate / ActiveRecordはOnUpdate()を実行します

  3. OnUpdate()はFindAllByProperty()を呼び出します

  4. FindAllByProperty()は同じセッション内でクエリを実行しようとしますが、 セッションはまだ汚れているため、NHibernateはセッションをフラッシュします。

  5. 2.に戻る

したがって、スタックオーバーフロー。

これを回避するには、新しいセッション内でFindAllByProperty()を実行してください。

using (new SessionScope())
  if (FindAllByProperty("Title", this.Title).Length > 1)
     throw new Exception("duplicate Message in update");