DevExpress XAF 中的多个 OnSaving 事件

Multiple OnSaving event in DevExpress XAF

我正在使用 DevExpress XAF 处理一段代码,我注意到如果我使用代码执行 2 次的事件 OnSaving,我该如何防止

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

     base.OnSaving();
}

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

我看到您正在根据 Monto 属性 的值更改 PrestamoP.Prestado 属性。如果您只执行一次并且仅在第一次指定 Monto 属性 时执行此代码,则没有问题。如果您:

,则此代码不合适:
  • 保存此对象而不更改 Monto 属性;
  • 更新早期指定的 Monto 值。

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

我可以在 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);
        }

您可以使用下面的代码来防止 xaf 在保存时进入两次。

base.OnSaving();
SessionObjectLayer sessionObjectLayer = this.Session.ObjectLayer as SessionObjectLayer;
        if (sessionObjectLayer == null || sessionObjectLayer.ParentSession == null)
        {
            //Enter only once
        }