【问题标题】:Multiple OnSaving event in DevExpress XAFDevExpress XAF 中的多个 OnSaving 事件
【发布时间】:2018-11-12 15:35:40
【问题描述】:

我正在使用 DevExpress XAF 编写一段代码,我注意到如果我使用事件 OnSaving 代码执行 2 次,我该如何防止这种情况发生

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

     base.OnSaving();
}

【问题讨论】:

    标签: devexpress xaf


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 请记住,Stack Overflow 不仅仅是为了解决眼前的问题,而是为了帮助未来的读者找到类似问题的解决方案,这需要了解底层代码。这对于我们社区的初学者和不熟悉语法的成员来说尤其重要。鉴于此,您能否edit 您的答案包括对您正在做什么的解释以及为什么您认为这是最好的方法?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多