DevExpress XAF中的多个OnSaving事件

时间:2018-11-12 15:35:40

标签: devexpress xaf

我正在使用DevExpress XAF处理一段代码,我注意到,如果即时消息使用事件OnSaving来执行两次,我该如何防止

protected override void OnSaving()
{
    if (PrestamoP != null)
    {
        PrestamoP.Prestado -= Monto;
        PrestamoP.Save();
     }
     else if (PrestamoG != null)
     {
         PrestamoG.Prestado -= Monto;
         PrestamoG.Save();
     }

     base.OnSaving();
}

2 个答案:

答案 0 :(得分:2)

XPO不保证OnSaving方法被调用一次。请参阅XPO Best Practices文章中的相应注释。

我看到您正在基于Monto属性的值更改PrestamoP.Prestado属性。如果仅执行一次并且仅在首次指定Monto属性时执行此代码,则该代码很好。如果您执行以下代码,则此代码不正确:

  • 保存该对象而不更改Monto属性;
  • 更新早期指定的Monto值。

因此,似乎对于PrestamoG.Prestado属性需要更复杂的逻辑。首先,我将其移至Monto属性设置器,并考虑先前的值(在这种情况下,请不要忘记检查IsLoading属性)。其次,我将考虑动态计算Prestado值,而不是存储其值。这将使您解决重复业务逻辑执行中的问题。在此处查看示例:How to: Calculate a Property Value Based on Values from a Detail Collection

答案 1 :(得分:0)

我可以在 onSaving 方法上为 CRUD 函数提供不同的方法。 IsNewObject,IsDeleted。

// insert
        if (Session.IsNewObject(this))
        {
            a = new a(Session);
            a.CreateReferencedProperties(this);
        }
        // delete
        else if (IsDeleted)
        {
            a= Session.FindObject<A>(PersistentCriteriaEvaluationBehavior.InTransaction, CriteriaOperator.Parse("A=?", this));
            if (a!= null)
                a.Delete();
        }
        // update
        else
        {
            a= Session.FindObject<A>(PersistentCriteriaEvaluationBehavior.InTransaction, CriteriaOperator.Parse("A=?", this));
            if (a!= null)
                a.CreateReferencedProperties(this);
        }