私は 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
ます。
私は何を間違っていますか?
削除されたアイテムを「復元」する方法は?