2011-11-21 11 views
5

私はシンプルなWCFクライアント/サーバーの状況で動作する単純なトランザクションセットを得るためにいくつかの方法を試してきました。私のWCFサーバーには、データベースアクセスのためのEntity Frameworkクラスのクラスレベル宣言と、SaveChangesへのデータとメソッドを変更するいくつかのメソッドがあります。 Oracle Data Access(ODP.NET)を使用しています。Entity FrameworkおよびWCFをトランザクションと連携させるにはどうすればよいですか?さて、秘密は何ですか?

たとえば、クライアントからの変更を呼び出してから、WCFサービスの変更を保存する別の呼び出しを呼び出したいとします。それは動作しません。基本的にはすべて正常に実行されますが、変更を保存するための2回目の呼び出しが行われると、WCFサービスはもはや元のコンテキストを持たないため、変更は保存されません(したがって、変更を加えた前の呼び出しは自動的にロールバックされます) 。

私はクライアントで両方の操作の周りにTransactionスコープを利用していますし、完了後にComplete()を実行しています。私のWCFサービスは、[TransactionFlow(TransactionFlowOption.Mandatory)]を使用するOperationContractを持ち、これらのメソッドの実装は[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]を使用します。最後に、私のWeb設定は、transactionFlowプロパティがTrueに設定されているwsHttpBindingで設定されています。

私は運がありません。私が何を試みても、フォローアップセーブのためにサービスを打ちようとすると、EFコンテキストは既に更新されています。

+0

すべてのバインディングがトランザクションをサポートするわけではありません。 http://www.wrox.com/WileyCDA/Section/Transactions-in-WCF-and-NET.id-305253.html – faester

+0

通話間のセッションをどのように処理していますか? WCFはデフォルトではステートレスなので、あなたが何かを失うかもしれない状態で何かをするようWCFに指示しない限り、そうではありません。 –

+0

edmxまたはpocoによって生成されたエンティティが生成される – Praneeth

答えて

4

これはトランザクションとは関係ありません。トランザクションはトランザクションリソース上で動作しますが、最初のリクエストでSaveChangesを呼び出すことなく、EFコンテキストはトランザクションの一部ではないため、トランザクションリソースはアクティブではありませんでした - データベースはデータベースであり、データベースはSaveChangesこの作業を行うには、分散トランザクションは必要ありません。セッションフルサービスが必要で、EFコンテキストをサービスインスタンスに格納します。クライアントは同じクライアントインスタンスを使用して、同じサービスインスタンスによって通信が処理されるすべての要求に対してサービスと通信します。以前の呼び出しからの変更を記憶する同じEFコンテキストインスタンスです。

IMHOこれは非常に悪いアーキテクチャです。単にそれを使用しないでください。変更を行い、保存するWCFサービスの特殊なメソッドを公開します。他のトランザクションリソースとのトランザクションでこれらのメソッドを実行する必要がある場合は、実際の分散トランザクションを使用します。

+0

私はあなたの答えを尊重します。そして、私はそれが答えになるのではないかと心配しました。バマー。残念ながら、私のサービスの使用を降格させます。たとえば、私のサービスのユーザーが注文を作成したり、その注文(製品の詳細など)に無関係な要素を作成/変更したり、両方の操作を行うと、それらを1つのトランザクションにまとめることを許可したい場合原子(多重パス)方式で行われるべきではありません。それは吸うが、私はあなたが言っていることを理解している。ご回答有難うございます。 – Prethen

1

これは理由があります。あなたが別の状況で更新を行っているからです。コンテキストはオブジェクトが更新されていることを知らないので、オブジェクトが変更されたことを知らせてからsavechnages()を呼び出します。役立つかどうかを確認する

+0

あなたは正しいです。基本的には、これは以前のレスポンダが指摘したものです。コンテキストとサービスをステートフルにしなければ、私はそれを行うことができないのは残念です。 – Prethen

関連する問題