0

Entity Framework 4 および STE (Self tracking entitites) と組み合わせて (ria ではなく) WCF を使用する予定です。これを正しく理解していれば、WCF はエンティティまたはエンティティのコレクション (たとえば、IQueryable ではなく LIST を使用) をクライアント (私の場合は Silverlight) に返す必要があります。

その後、クライアントはエンティティを変更または更新できます。この時点で、それは自己追跡だと思いますか? これは、追跡しない STE に関する問題が多数報告されているため、少し混乱するところです。

とにかく、更新するには、更新を行う別の方法でエンティティを WCF サービスに送り返すだけです。毎回新しい OBJECTCONTEXT を作成する必要がありますか? すべての方法で?

WCF のすべてのメソッドで毎回新しいオブジェクト コンテキストを作成している場合、STE をオブジェクト コンテキストに再アタッチする必要はありませんか?

基本的にこれだけではうまくいかないのでしょうか??

using(var ctx = new MyContext())
{
    ctx.Orders.ApplyChanges(order);
    ctx.SaveChanges();
}

または、WCF サービスのコンストラクターで一度オブジェクト コンテキストを作成して、同じ WCF インスタンスを使用する 1 回の呼び出しとすべての追加の呼び出しで同じオブジェクト コンテキストが使用されるようにする必要がありますか?

クライアントからの各メソッド呼び出しで WCF サービスを作成および破棄することができたので、毎回新しい objectcontext を実際に作成しました。

objectcontext を非常に長い間存続させるのは良い考えではないことを理解しています。

4

2 に答える 2

3

あなたはいくつかの質問をしているので、私はそれらに個別に答えようとします:

IQueryable を返す:

IQueryalbe を返すことはできません。IQueryable は、実行する必要があるクエリを記述します。サービスから IQueryable を返そうとすると、サービス応答のシリアル化中に実行されます。ObjectContext が既に閉じられているため、通常は例外が発生します。

クライアントでの追跡:

はい、クライアントが STE を使用している場合、STE はクライアントの変更を追跡できます。STE を使用したアセンブリは、サービスとクライアントの間で共有する必要があります。

ObjectContext の共有:

データを更新するサーバー環境で ObjectContext を共有しないでください。呼び出しごとに常に新しい ObjectContext インスタンスを作成します。ここに理由を記載しました。

STEの取り付け

STEを取り付ける必要はありません。ApplyChanges がすべてを行います。また、サービス操作から注文を戻したい場合は、AcceptChanges を呼び出す必要があります。

サービス コンストラクターでのオブジェクト コンテキストの作成:

WCF には、サービス インスタンスを操作するための独自のルールがあることに注意してください。これらのルールはInstanceContextModeに基づいており、バインディングを使用します (また、 IInstanceProviderを実装することで独自のルールを実装できます)。たとえば、BasicHttpBinding を使用する場合、既定のインスタンス化は PerCall になります。これは、WCF が要求ごとに新しいサービス インスタンスを作成することを意味します。ただし、代わりに NetTcpBinding を使用すると、既定のインスタンス化は PerSession になり、WCF は単一のクライアント (単一のクライアント プロキシ インスタンス) からのすべての要求に対して単一のサービス インスタンスを再利用します。

クライアントでのサービス プロキシの再利用:

これは、使用されるバインディングとサービスのインスタンス化にも依存します。セッション指向バインディングが使用される場合、クライアント プロキシは単一のサービス インスタンスに関連付けられます。そのプロキシでメソッドを呼び出すと、常に同じサービス インスタンスで操作が実行されるため、サービス インスタンスはステートフルになります (呼び出し間で共有されるデータを含むことができます)。これは一般的に良い考えではありませんが、可能です。セッション指向の接続を使用する場合、発生する可能性のあるいくつかの問題に対処する必要があります (より複雑です)。BasicHttpBinding はセッションを許可しないため、クライアント プロキシが 1 つであっても、各呼び出しは新しいサービス インスタンスによって処理されます。

于 2011-01-09T14:02:47.880 に答える
0

エンティティを新しいオブジェクト コンテキストにアタッチできます。 http://msdn.microsoft.com/en-us/library/bb896271.aspxを参照してください。

ただし、状態は変更されません。

私がそれを行う方法は次のとおりです。

  • データベースに情報を再クエリする
  • 送信されているオブジェクトと比較します
  • 変更を加えてデータベースからエンティティを更新します
  • 次に、通常の変更の保存を行います

編集

コメントで指摘されているように、上記はPOCO用でした

STE の場合、毎回新しいコンテキストを作成しますが、「ApplyChanges」を使用します。次を参照してください: http://msdn.microsoft.com/en-us/library/ee789839.aspx

于 2011-01-09T16:33:58.603 に答える