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
}
我正在使用 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
}