2011-07-07 4 views
1

作業単位はEntityFrameworkに実装されているため、ObjectContextを使用してEntityに変更を加えたときに追跡され、その後SaveChanges基礎となるデータベースに反映されます。EntityFramework、作業単位 - カスタムデータの変更を追跡してWebService経由で送信する

しかし、カスタムクラスの変更を追跡して、すべての変更が追跡され、webserviceコールによって送信されるようにしたいのですが?

私はいくつかのデータを提供するWebサービスを持っています。そのデータはDataGridに表示され、変更される可能性があります。私はすべての変更を追跡し、変更されたデータだけをwebservice経由で返信したいと考えています。 EntityFrameworkやPOCOのようなものはありますか?それとも自分の作業単位パターンを実装する必要がありますか?

答えて

1

エンティティがコンテキストに関連付けられている場合にのみ、変更の追跡が機能します。 Self tracking entitiesと呼ばれる特別な種類のエンティティがあり、Webサービスで公開されてもクライアント側の変更を追跡できますが、これらのクラスは依然として主体(カスタムオブジェクトではありません)であり、トラッキング状態を直接コンテキストに適用します。

説明したことは、作業単位パターンとは関係ありません。差異だけをサービスに戻すことができる変更セットパターンを探しています。そのようなクラスの実装は完全にあなた次第です。 .NETはそれらを提供しません。 .NETが変更設定パターン

  • の2つの実装を提供しています(しかも、少なくともデータセットがデフォルトで持っているEF
  • のDataSetおよび関連クラス

どちらも、デフォルトでこれらの実装転送のための自己追跡エンティティにすべてのデータを述べましたメッセージの古い状態と新しい状態の両方)。両方のデータセットとSTEは同じ制限を共有しています - very badly interoperableです。

0

さまざまな理由により、プロパティレベルでの変更の追跡をWCF呼び出しのクライアントに任せてはいけません。 DTO(Data-Transfer Object)パターンを使用する場合は、変更されたオブジェクト全体をワイヤを介して送信する際に重大なオーバーヘッドが発生しないように、個々のオブジェクトを小さく保つ必要があります。次に、サーバー側で、オブジェクトの現在のバージョンをデータベースからロードし、DTOによって提供される値を設定し、Entity Frameworkで変更されたプロパティを追跡させます。あなたは、クライアント側で複数のオブジェクトを変更している、とあなたは、ユーザが変更されていたものを追跡したい場合は

public SavePerson(Person person) 
{ 
    using(var context = _contextFactory.Get()) 
    { 
     var persistentPerson = context.People.Single(p => p.PersonId == person.PersonId); 
     persistendPerson.FirstName = person.FirstName; 
     /// etc. (This could be done with a tool like AutoMapper) 
     context.SaveChanges(); 
    } 
} 

、あなたは、クライアントが変更を取得するオブジェクトを追跡するための責任があるかもしれないし、それらのオブジェクトだけを一括してWebサービスに送信します。そこで、同じパターンを適用し、すべてのオブジェクトが更新されるまでSaveChangesを待機させることができます。

うまくいけば、これが役に立ちます。

+0

クライアント側で複数のオブジェクトを変更していて、どのオブジェクトが変更されたかを把握したい場合は、変更されたオブジェクトの追跡をクライアントに依頼し、バルクでWebサービスに送信します。そして、それは私の質問でした。どのようにクライアントが適切な方法で適切なコーディング方法で変更されたオブジェクトを追跡する責任を負うことができますか?私は、Save()が呼び出されたときに変更されたデータをワイヤを介して送信する作業単位の実装について考えました。それは解決策ですか? – kkris1983

+0

@ kkris1983:あなたのEFコンテキストがクライアント側で行われた変更を追跡し続けるようにしたいと思ったように、質問がどのように表現されたかのように聞こえました。クライアント側の変更を追跡する方法は、EF/WCFよりもクライアント側のフレームワークに依存します。たとえば、エンティティをJavascriptオブジェクトとして解決している場合は、変更された各オブジェクトに「IsChanged = true」プロパティを簡単に追加できます。 Silverlightを使用している場合は、辞書を使用して変更された各オブジェクトを追跡することができます。 – StriplingWarrior

+0

辞書やその他のコレクションの変更を保存する際の問題は、WebServiceから、他のタイプのオブジェクトのコレクションを含むオブジェクトのコレクションを持つ複合オブジェクトを受け取ることです。したがって、最も深いオブジェクトに変更が加えられた場合、チェーン内のすべてのオブジェクトを含むオブジェクトをダーティとしてマークする必要があります。編集が完了したら、すべてをパラメータとしてWebサービスメソッド呼び出しに渡す必要があります。どのように変化のチェーンを追跡するのですか? – kkris1983

関連する問題