我正在研究WCF数据服务,尤其是DataServiceCollection
中的变更跟踪实施。
让我们考虑应用程序中的撤消场景,它管理博客和博客条目(每个博客都有许多博客条目)。我正在测试两种撤消操作:
这是代码示例:
var context = new BloggingContext(new Uri("http://localhost/WCFDataServicesDemo/"));
var blogs = new DataServiceCollection<Blog>(context.Blogs.Expand(b => b.Entries), TrackingMode.AutoChangeTracking);
var blog = blogs.Where(b => b.Id == 1).Single();
// new entry
var newEntry = new BlogEntry
{
// some blog entry's properties
};
// add new entry
blog.Entries.Add(newEntry);
// undo add
blog.Entries.Remove(newEntry);
// existing entry
var existingEntry = blog.Entries[0];
// remove existing entry
blog.Entries.Remove(existingEntry);
// undo remove
blog.Entries.Add(existingEntry);
context.SaveChanges();
第一个撤消操作(添加新条目,然后在撤消时将其删除)工作正常 第二个撤消操作(删除现有条目,然后在撤消时添加它)非对称地工作。
这一行:
blog.Entries.Remove(existingEntry);
在上下文的更改跟踪器中将对应的实体标记为Deleted
,这是正确的。但是这一行:
blog.Entries.Add(existingEntry);
对更改跟踪器(existingEntry
保持在Deleted
状态)没有任何作用,但当然会将项目添加到集合中。
因此,当调用SaveChanges
时,此条目将从数据库中删除,但它仍保留在客户端的集合中。
我试图通过在DataServiceCollection
构造函数中设置回调来手动处理此撤消,但在这里我得到了相同的非对称行为 - collectionChangedCallback
在我尝试时不会触发添加项目,标记为Deleted
。
我做错了什么? 如何“恢复”已删除的项目?
答案 0 :(得分:1)