2012-04-18 5 views
1

Webサービスを作成しましたが、C#とLINQを使用してデータベースからオブジェクトを作成しています。データベース内のテーブルは、対応するオブジェクトと同様に、互いにリレーションシップを持ちます。WebServiceからオブジェクトをシリアル化するときに、オブジェクトにクライアントの参照がありません

しかし、Webサービスにアクセスしているクライアントでは、関係はなくなりました。これは、シリアル化に何か問題があることを信じさせる。シリアル化を動作させるには、LINQオブジェクトを編集してシリアライズモードを "一方向"に変更し、アソシエーションをAccess => publicの代わりに子プロパティの下に設定します(そうでなければ循環参照エラーが発生します)。

これで、クライアントのオブジェクト参照にアクセスできなくなりました。誰もそれを解決する方法を知っていますか?それは解決可能ですか?私のレシピとカテゴリー間の関係を与える

Recipe r = new Recipe(); 
r.RecipeHasCategories(); 

例は、私のWebサービスでは、私がこれを書い傾けます。これはクライアントでは機能しません!私がアクセスできるのは、そのレシピに固有の属性(例:名前と説明)です。

ヘルプ?

答えて

2

Entity Frameworkは、デフォルトで関連オブジェクトをロードしません。リレーションシップを必要とする操作を実行し、エンティティが依然としてEFコンテキストにアタッチされている場合は、オンデマンドでロードを実行します。

オブジェクトをシリアル化すると、オブジェクトはコンテキストから切り離され、このオンデマンドの読み込みは機能しなくなります。既にメモリにロードされているものだけをシリアル化します。

.Include()メソッドを使用して、元のクエリですべての関連オブジェクトを取得する方法については、this MSDN articleを参照してください。

UPDATE:

古いのLINQ 2 SQLプロバイダを使用しているので、Include方法がありません。クエリーを実行する前に、コンテキストオブジェクトのDeferredLoadingEnabledfalseに設定して、遅延オブジェクトロードを無効にするだけで済みます。

+0

私はそれを試しましたが、動作させることができませんでした。メソッドの.Include()は、LINQオブジェクトには存在しません。 – stinaq

+0

あなたはどのLINQプロバイダーを使用していますか? EFを使用している場合は、エンティティコンテキストの各「テーブル」( 'ObjectQuery')に' Include'メソッドを持たなければなりません。 'Include'を早めに使う必要があります。なぜなら、' IQueryable'を取得するともうメソッドが存在しないからです。 –

+0

vsで提供されているLINQ to SQLを使用していて、Include()メソッドが見つかりません。物事をたくさん回そうとしましたが、そこにはありません! – stinaq

関連する問題