当PersistChangeSet在Silverlight/RIA中失败时,如何防止整个ChangeSet回滚
本文关键字:何防止 回滚 ChangeSet 失败 PersistChangeSet Silverlight RIA | 更新日期: 2023-09-27 18:21:48
在我的场景中,我通常将所有数据库持久性逻辑放在PersistChangeSet覆盖中,由于它使我更容易同步涉及引用其他实体中id的实体的存储过程包装调用(例如,如果我有一个实体A引用了另一个实体B中的临时id-1,我希望能够首先保存实体B,然后用从数据库返回的实体B的id更新实体A中的id引用)。
当一个存储过程由于任何原因返回错误时,我只会在存储过程返回的消息中抛出一个自定义异常,并利用客户端(视图模型)上SubmitOperation对象的HasError和error 我使用刚才描述的方法遇到的问题是,即使三分之二的"持久性操作"(即对存储过程包装器的调用)成功,持久性错误也会回滚整个ChangeSet。因此,例如,如果我在客户端为一个实体设置了临时id-1,然后在PersistChangeSet中,我在成功保存到数据库后将该id更新为新值,当我返回SubmitChanges回调时,该id将恢复为-1(因为其他一些实体未能保存在PersistChangeSet)。理想情况下,成功持久化的实体应在SubmitChanges完成时从ChangeSet中删除。 我希望我已经很好地描述了我的问题,但可以要求任何澄清。如果我上面描述的方法不理想或违反了RIA的管理原则,我愿意接受建议。 提前感谢您的帮助!
我通过在域服务中重写Submit方法中使用TransactionScope解决了这个问题。这允许PersistChangeSet作为一个工作单元(换句话说,只有在所有操作都成功的情况下,更改才会被持久化)。
此处提供详细信息:http://msdn.microsoft.com/en-us/library/ee707364(v=vs.91).aspx