0

私は WCF Data Services、特に での変更追跡の実装を検討していDataServiceCollectionます。

ブログとブログ エントリを管理するアプリケーションで元に戻すシナリオを考えてみましょう (各ブログには多くのブログ エントリがあります)。2 種類の元に戻す操作をテストしています。

  • 新しいブログ エントリが追加されました (元に戻す操作はエントリを削除することです)。
  • 既存のブログ エントリが削除されました (元に戻す操作はエントリを追加することです)。

コードサンプルは次のとおりです。

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();

最初の元に戻す操作 (新しいエントリを追加し、元に戻すときに削除する) は正常に機能します。
2 番目の元に戻す操作 (既存のエントリを削除してから、元に戻す操作に追加する) は非対称に機能します。

この行:

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 に答える