我正在使用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();
}
答案 0 :(得分:2)
XPO不保证OnSaving方法被调用一次。请参阅XPO Best Practices文章中的相应注释。
我看到您正在基于Monto属性的值更改PrestamoP.Prestado属性。如果仅执行一次并且仅在首次指定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);
}