4

私は現在、Entity Framework (.NET Framework バージョン 3.5 SP1 にパッケージ化されたバージョン) と多くの AJAX ベースの機能の両方を利用するプロジェクトに取り組んでおり、クライアント側で jQuery を使用し、ASP.NET WebMethods を使用して実装しています。サーバー側。

通常、次のようにエンティティをパラメーターとして受け入れる WebMethod を使用して、新しいエンティティを作成します。

 [WebMethod]
 public static void Add(User user);

このメソッドを呼び出すときは、JavaScript で (プロパティに関して) エンティティに似たオブジェクトを組み立てて、JSON 文字列として渡します。ただし、関連するエンティティを多対多の関係で渡そうとすると、問題が発生しました。User エンティティが Flight エンティティと 1 対多の関係を持っているとします。複数の (新しい) フライトを持つ新しいユーザーを追加すると、問題が発生することがわかっています。次のアプローチ:

 this.user.Flight = [];
 var x = new Object();
 // Code here to populate x's properties
 this.user.Flight.push(x);
 // Repeat again for more flights

List を EntityCollection に変換できないことを示す ASP.NET エラー (逆シリアル化段階) が発生します。

次に、このアプローチを試しました:

 this.user.Flight = {};
 var x = new Object();
 // Code here to populate x's properties
 this.user.Flight.firstFlight = x;
 // Repeat again for more flights

この例では、WebMethod は正常に呼び出されましたが、フライトは完全に失われました (WebMethod で user.Flight.Count() を呼び出すと 0 が返されました)。

EntityCollection の複数の Flight を WebMethod に渡す方法を知っている人はいますか?

4

2 に答える 2

2

EF エンティティ クラスを直接使用しようとすると、組み込みのシリアライザーを使用するのが難しい場合があります。JavaScript 配列から EntityCollection に逆シリアル化できたとしても、別の方法 (EF オブジェクト グラフから js obj へ) に進むことはできません。有名な「循環参照」エラーが発生します。

EF と Web サービスを使用するプロジェクトがたくさんあります (ただし、動的データはまだ使用していません)。他にも試してみるべき良いオプションがあるかもしれません。エンティティ クラスのすべてのプロパティと関係を表す DTO または POD クラス (「Data Transfer Object」または「Plain Old Data」) クラスを作成できる場合があります (ただし、メソッドやその他のコードは含まれません)。それらは簡単にシリアライズおよびデシリアライズして、ワイヤ上で渡すことができます。ただし、循環参照エラーが発生する可能性があります。それらについては、循環参照をサポートするJson.NETを使用して独自のシリアル化を行うことができます。文字列を返すようにサービスを変更する必要があり、JavaScript 呼び出しサイトで json 文字列をオブジェクト リテラルに評価する必要があります。それか'

おそらく、DataSvcUtil.exeを使用して DTO クラスを作成できます。

そうは言っても、私は現在あなたの問題を解決しようとしているプロジェクトをセットアップしています。あなたが述べたのと同じエラーが発生し、javascript で [] から {} に切り替えると、あなたが言及したのと同じ動作が発生します。これからも頑張っていきますので、何かありましたらご報告いたします。

于 2009-11-19T22:06:56.613 に答える
1

Flightのリストを 2 番目のパラメータとして返してから、それらをメソッド内のUserに追加しないのはなぜですか?

[WebMethod]を EF パラメーターと共に使用せず、通常は POD 構造をパラメーターとして渡すため、この問題が発生したことはありません....

于 2009-11-19T19:17:37.317 に答える