2010-07-25 6 views
0

Когда я звоню FindAllByProperty, он вызывает OnUpdate в замке Активная запись. Это вызывает переполнение стека, потому что я делаю некоторую дублирующую проверку на OnUpdate экземпляре. Рассмотрим следующий код. Почему он звонит OnUpdate? Как это остановить?Почему Замок Активные записи `FindAllByProperty` называет` OnUpdate`?

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

    base.OnUpdate(); 
} 

ответ

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");