2016-12-16 4 views
1

私のC#アプリケーションでは、QuickBooksにデータを追加するための仲介DLLを介してリクエストを送信しようとしています。仲介DLLは、設定に基づいて、アイテムの追加要求をWCFサービスを通じて送信します。サービスプロジェクトでは、その中に格納されているすべてのメソッドに操作規約が使用されています。データ契約/データメンバーはありません。Entity Framework 6.0とWCFでのオペレーション契約シリアライゼーションエラー

これは、請求書やその他の取引を検索します。ただし、アイテムを追加するとき、私はこのエラーが表示されます。

A first chance exception of type 'System.Runtime.Serialization.SerializationException' occurred in System.Runtime.Serialization.dll

Additional information: Type 'System.Data.Entity.DynamicProxies.QBLookUp_A96F53AD8DA6F21651FEF0B25078616AB4989DA745EE06E345D365196574CE0F' with data contract name 'QBLookUp_A96F53AD8DA6F21651FEF0B25078616AB4989DA745EE06E345D365196574CE0F: http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies ' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to the serializer.

は、ここでは、スタックオーバーフローの周りを見ると、私はこの問題を回避するために、私のEFモデルでプロキシ作成をオフにすることを示唆し、いくつかのスレッドに走りました。

A)データの様々なビットがない:私はプロキシの作成をオフにしたときに、私は2つの新しい問題に実行しかし

this.Configuration.ProxyCreationEnabled = false; 

、:だから、私はEFプロジェクトにコンストラクタにコードのこのビットを挿入しました私のC#アプリケーションで表示されます。このデータは、Entity Frameworkによってアプリケーションに提供されます。

B)WCFサービスを介してアイテムを保存しようとしたとき、私はこのエラーが表示されます。

Additional information: Object graph for type 'System.Collections.Generic.HashSet`1[[EFModel.Item, EFModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' contains cycles and cannot be serialized if reference tracking is disabled

これは、次の結論に私をリード - 私は、プロキシの作成が仕事に自分のアプリケーションのためのために有効にする必要があります同時に、私は私のサービスに何か悪いことをしているかもしれません。私は物事を働かせるために私が何を変えることができるかについて誰にも示唆を持っていますか?

答えて

0

この問題は、通常、WCFで実行できないデータをシリアル化しようとすると発生します。プロキシの作成をオフにすると、なぜ最初の応答がうまくいくのですか?WCFは、プロキシがオンの場合にDataContract属性でクラスをマークした場合、どのデータをシリアル化する必要があるかを知ります。それらのクラスを直列化することはできません。

エンティティフレームワークを使用している場合は、ラムダ式を使用してクライアントのデータベースからレコードを取得していたと思います。 WCFはデフォルトでラムダ式をシリアライズしないので、ラムダ式をクライアントから問い合わせるためにラムダ式を渡すことはできません(WCFはSOAアーキテクチャーに使用されるため、あらゆる種類のクライアント(JAVA、C++など)このサービスを使用し、ラムダ式は特定の言語に固有です.WCFでこの機能を実装すると、SOAアーキテクチャのルールに違反します)。

ラムダ式を使いたい場合は、ダイナミックラムダ式を作成する必要があります。しかし、それはクライアントがその方法で使用するように拘束されるため、実装するのには良い方法ではありません。クライアントでラムダ式を使用しないでください。

作成動的なラムダ式は、このリンクに与えられている:私はEFはWCFが処理できなかったことのプロキシを作成していたすべてのオブジェクトのDTOを使用してに頼っ最後に

https://www.codeproject.com/Articles/1079028/Build-Lambda-Expressions-Dynamically

0

。これは少しコードが追加されましたが、プロキシと遅延ロードを使用できるため、結果はうまく機能しました。

関連する問題