2012-02-29 5 views
3

WCF経由のナビゲーションプロパティを持つEntity Frameworkで生成されたエンティティを送信するときに問題が発生します。WCFでEntity Frameworkエンティティを送信する:ナビゲーションフィールドのシリアル化を防ぐ方法

Stock : Id, Symbol, CompanyName, ExchangeName
Option: Id, StockId, OptionType, Strike

私はこのデータベースのEntity Frameworkのモデルを作成しました:私は、その内部の財務データと2つのテーブルを格納するためのSecuritiesのデータベースを持っています。次に、生成されたStockOption EFエンティティをクライアントに公開するWCFサービスを作成しました。

私の生成したエンティティStockのナビゲーションプロパティはEntityCollection<Option> Optionsです。 StockエンティティをWCFサービスからクライアントに返すときに、SerializationExceptionが表示されます。データベース接続が既に閉じられているため、WCFはOptionsナビゲーションプロパティをシリアル化できません。

Optionsプロパティを入力するためにデータベース接続を開いたときにOptions.Load()メソッドを呼び出すことができますが、Stockエンティティのフルオブジェクトグラフをロードしない場合はどうすればよいですか?

+0

エンティティはコードレイヤーのPOCOであっても、サービスレイヤーではありません.EFはそれらを変更します。道を邪魔しないようにして、あなたのサービス層に別のモデル/ DTOを作成してください。 – jrummell

答えて

13

私はこれとしばらく戦ってきました。

まず、遅延ロードをオフにしました。しかし、私はまだオブジェクトグラフのサイクルに問題がありました。
次に、すべてのエンティティに[DataContract(IsReference = true)]というタグを付けました。これはうまくいきましたが、私はまだ非正規化されたデータベースに対して多くのパフォーマンス上の問題を抱えていました。 最後に、私は壊れてdtosを作成し、AutoMapperを使用してそれらを設定します。

私の同僚の1人が、これを最初からやるようにと言っていました。自分の好意を持って、私がやったのと同じ間違いをしないでください。

編集
私はタイプICollection<T>の性質を持つエンティティをデシリアライズの問題があったことを言及するのを忘れてしまいました。これらは配列としてデシリアライズされます。何とかT[]ICollection<T>を実装しますが、AddRemoveは例外をスローします。これがDTOを使用する別の理由でした。

+0

配列( '[]')は.NETでは 'Add()'することはできません。それは 'push()'することができるJavascipt配列のようなものではないので、エラーが出るのです。それが 'List 'であれば –

0

EF5の場合は、EF4の使用が不明な場合、これが機能する可能性があります。ナビゲーションプロパティの設定をprivateに変更します。

関連する問題