0

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

当一个存储过程由于某种原因返回错误时,我只需使用存储过程返回的消息引发自定义异常,并利用客户端(视图模型)上的SubmitOperation对象的HasErrorError属性来通知用户发生了什么错误的。

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

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

在此先感谢您的帮助!

4

1 回答 1

0

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

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

于 2013-07-10T19:29:25.863 回答