yhorby matias
yhorby matias

Reputation: 73

Multiple OnSaving event in DevExpress XAF

Im working on a piece of code using DevExpress XAF, I noticed that if im using the event OnSaving that the code executes 2 times, how can i prevent that

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

     base.OnSaving();
}

Upvotes: 3

Views: 2306

Answers (3)

You can use the code below to prevent xaf from entering on saving twice.

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

Upvotes: 0

Serdin Çelik
Serdin Çelik

Reputation: 203

I can offer different methods for CRUD functions on onSaving method. 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);
        }

Upvotes: 0

Kill4kan
Kill4kan

Reputation: 46

XPO does not guarantee that the OnSaving method is called once. See the corresponding note in the XPO Best Practices article.

I can see that you are changing the PrestamoP.Prestado property based on the value of the Monto property. This code is fine if you execute it only once and only when the Monto property is specified for the first time. This code is not fine if you:

  • Save this object without changing the Monto property;
  • Update the early specified Monto value.

So, it appears that a more complex logic is required for the PrestamoG.Prestado property. First, I would move it to the Monto property setter and take the previous value into account (do not forget to check the IsLoading property in this case). Second, I would consider calculating the Prestado value dynamically instead of storing its value. This will allow you to resolve issues with the duplicate business logic execution. See an example here: How to: Calculate a Property Value Based on Values from a Detail Collection.

Upvotes: 3

Related Questions