如何在Silverlight / RIA中PersistChangeSet失败时阻止整个ChangeSet的回滚

时间:2013-07-10 18:47:56

标签: c# wcf silverlight wcf-ria-services ria

在我的场景中,我通常将所有数据库持久性逻辑放在 PersistChangeSet 覆盖中,因为它使我更容易同步我的保存存储过程包装器调用,涉及在其他实体中引用id的实体(例如,如果我有一个在另一个实体B中引用临时id为-1的实体A,我希望能够先保存实体B,然后在实体A中使用从数据库返回的id更新其id引用实体B)。

当一个存储过程因任何原因返回错误时,我只是使用存储过程返回的消息抛出一个自定义异常,并利用 SubmitOperation 对象的 HasError 和<客户端(视图模型)上的strong>错误属性,以便通知用户出了什么问题。

我刚刚描述的方法遇到的问题是持久性错误会回滚整个 ChangeSet ,即使是3个“持久性操作”中的2个(即调用存储过程)包装)成功。因此,例如,如果我在客户端为实体设置了临时id为-1,然后在 PersistChangeSet 中,则在成功保存到数据库后,我将该id更新为新值,我回到 SubmitChanges 回调时,id将恢复为-1(因为其他一些权利未能保存在 PersistChangeSet 中)。理想情况下,在SubmitChanges完成时,应该从ChangeSet中删除成功保留的实体。

我希望我已经足够好地描述了我的问题,但随时可以要求任何澄清。如果上述方法不理想或违反RIA的管理原则,我愿意接受建议。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我通过在域服务中覆盖提交方法使用TransactionScope来解决此问题。这允许PersistChangeSet作为一个工作单元(换句话说,只有在所有操作都成功时才会保持更改)。

详细信息:http://msdn.microsoft.com/en-us/library/ee707364(v=vs.91).aspx