0

我正在查看 WCF 数据服务,特别是在DataServiceCollection.

让我们考虑一个应用程序中的 undo 场景,它管理博客和博客条目(每个博客都有许多博客条目)。我正在测试两种撤消操作:

  • 添加了新的博客条目(撤消操作是删除条目);
  • 现有的博客条目被删除(撤消操作是添加条目)。

这是代码示例:

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.

我究竟做错了什么?
如何“恢复”已删除的项目?

4

1 回答 1

1

您可能可以使用 Detach 撤消更改。看到这篇文章:http ://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/a944a15f-4a2f-424a-8222-584aad5eaf73

于 2012-10-22T15:11:15.983 回答