代码之家  ›  专栏  ›  技术社区  ›  Afshar Mohebi

为什么castle active record的“findallbyproperty”调用“onupdate”?

  •  0
  • Afshar Mohebi  · 技术社区  · 14 年前

    当我呼唤 FindAllByProperty 它叫 OnUpdate 在Castle活动记录中,这会导致堆栈溢出,因为我对 更新函数 一个实例。考虑以下代码。为什么它叫 更新函数 ?怎么能阻止它?

    protected override void OnUpdate()
    {
        if (FindAllByProperty("Title", this.Title).Length > 1)
            throw new Exception("duplicate Message in update");
    
        base.OnUpdate();
    }
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Mauricio Scheffer    14 年前

    以下是可能发生的情况:

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