4

ASP.NET MVC 3 用のライブラリ (Telerik) を使用しています。

AJAX によっていくつかのデータを返す必要があるすべての機能に問題があります。

私はEF4を使用してデータベースに接続しており、両方の方法でナビゲーションプロパティを必要としています(想像してください、いくつかの投稿を持つユーザーと1つの投稿にユーザーがいます)。

問題は、ライブラリが JSON でデータをエンコードする JavaScriptSerializer を使用していることです。

私が得るエラー

タイプ 'System.Data.Entity.DynamicProxies.Employee_34048F4F6A98297F826C798A27640C7383E95E8EA8282EC8A5F738FA0C77CBC3' のオブジェクトをシリアル化中に、循環参照が検出されました。"

親はその子を参照し、子はその親を参照しているため、例外です。

私はすでにいくつかの回避策を見つけましたが、私を完全に満足させるものは何もありません:

  • データ サーバー バインディングを使用: できません。機能は ajax で動作する必要があります (ページが最後までスクロールされたときに次の要素をロードするグリッドのページャー)
  • 匿名オブジェクトを使用する: データベースにフィールドが追加されている場合、すべての匿名オブジェクトに追加する必要があるため、柔軟ではありません。さらに、必要なサブコレクションが必要な場合は退屈です。このサブリストのすべての要素のオブジェクトも作成します。
  • ViewModel の使用: ほぼ同じ問題です。フィールドがもう 1 つある場合は、すべてのビューモデルにこのフィールドを追加する必要があり、モデルとまったく同じフィールドを持つ 60 個のビューすべてのビュー モデルを作成する必要があります。
  • を使用します。別のものになる。

私はWCFでほぼ同じ問題を抱えていました.循環参照の処理を知っているシリアル化されたものを作成しましたが、ここで同じことができますか? または、これを管理する方法はありますか?

そうでない場合は、「ViewModel」を使用するのが最善の方法だと思いますが、それらの作成を高速化する方法はありますか? 汎用オブジェクトのように、コンストラクターで EF オブジェクトを受け取り、循環参照を削除しますか? 他に何か?

どうもありがとうございました

4

1 に答える 1

5

実際には、というより[NonSerialized][ScriptIgnore]必要だろうということです。ただし、次の2つの角度のいずれかからこれにアプローチします。

  1. 親のものを除くRegisterConvertersすべてのプロパティを指定するカスタム コンバーターを使用して記述します (これはおそらく自動化することもできます。[SkipSerialize("Parent")]partial class

  2. 簡単に: EF POCO をシリアル化しないで、代わりに DTO を使用てください。これがあなたのViewModel答えの意味のようです。個人的には、クラスの「エンティティ」(EF/POCO) バージョンと、非常に似ているが異なる DTO バージョンを使用することに問題はありません。それらの意図は異なり、私の考えでは、DRY に違反していません。

于 2011-12-14T09:15:20.600 に答える