WCF data service如果savechanges()出错了,该怎么办

WCF data service如果savechanges()出错了,该怎么处理?
突然发现自己写的程序有个问题,
比如添加一个实体,然后savechanges(),
但这个实体可能由于各种问题不被数据库接受,
最后导致savechanges()抛出异常,
那捕获到异常后,该怎么处理呢?
因为这个实体已经通过AddTo实体()这个自动生成的函数添加到上下文中,
如果这个实体不处理掉,就一直存在上下文中,
以后做出其他操作,然后savechanges()时,由于之前的实体被上下文跟踪,就会一直保存失败,抛出异常,
那该怎么处理这个实体呢?
必须detach这个实体么?有没有别的办法?

这还简单一些,如果整了好多操作,然后一次性提交savechanges(),
如果这时抛出异常,那又该如何找到是哪一个具体的操作出了问题呢,真是费力啊,先是自己在客户端玩,结果玩爽后往数据库提交,出错,然后又不好追踪错误原因,哈哈?

还有一个问题,每次savechanges(),我都是下面子这样子捕获了,难道必须通过try来处理持久化失败消息么?
还有没有别的办法?
try
{
  savechanges()
}
catch
{

}


------解决方案--------------------
可以利用 ObjectContext.Refresh 方法,Refresh 第一参数是一个枚举:
1) RefreshMode.StoreWins 表示放弃本地数据,接受DB的数据。
2) RefreshMode.ClientWins 表示继续保持当前的数据,直到调用SaveChanges() 以当前数据更新到DB。

例:
northwind.Refresh(RefreshMode.StoreWins, northwind.Customers);
northwind.AcceptAllChanges();
------解决方案--------------------
还有一种方法是 Detach,将已知对象移除上下文。

ctx.Orders.Detach(order);
------解决方案--------------------
可将异常信息写入日记(应用程序级)文件中

异常信息最好能够自己定义为易判别的内容
------解决方案--------------------
sorry, 看成是 EF 回答你了。

刚才查看 msdn:
http://msdn.microsoft.com/zh-cn/library/gg602811.aspx中的“管理并发”一节中写道:

调用 SaveChanges 方法时,客户端会将更改发送回数据服务。当客户端中的数据更改与数据服务中的更改发生冲突时,SaveChanges 会失败。当发生这种情况时,您必须再次查询实体资源以接收更新数据。若要覆盖数据服务中的更改,请使用 PreserveChanges 合并选项执行查询。再次调用 SaveChanges 时,只要尚未对数据服务中的资源进行其他更改,客户端上保留的更改将永久保存到数据服务。

等我有时间测试下data service
------解决方案--------------------
放假回来,研究了下。

1. 客户端如果保持DataServiceContext实例的话,每次查询的结果都会缓存并跟踪。
跟踪的引用都在 Entities 里保存。
2. 我现在的做法是每次client修改数据都通过UpdateObject(DeleteObject,AddObject等)
保持到客户端的缓存中,最后点button更新服务端,当然这种并发冲突的概率是比较高的
3. 通过 MergeOption 来控制并发冲突,如果想让服务端数据刷回客户端,我现在的做法是通过
Entities 保持的Identity来逐一刷新。可能还有更好的办法。

C# code
   
   // 无论请求成功还是失败,重新查询把跟踪对象的State改为Unchanged.  
   northwind.Execute<object>(new Uri(entity.Identity)).ToList();