9

最近、厄介な問題に遭遇しました。ここでデータモデルを単純化しますが、原則はまったく同じです。クラス「User」があります。そのクラスには、ユーザーが所有するオブジェクトのリストであるプロパティがあります。このクラス「オブジェクト」もあります。すべての「オブジェクト」には所有者がいるため、その所有者にリンクする「ユーザー」タイプのプロパティがあります。今、私がやろうとしているのは基本的にこれです

return Json(myUser,JsonRequestBehavior.AllowGet);

ページを読み込むと30秒ほどかかり、「RecursionLimitを超えました」というエラーが表示されます。

これは、オブジェクトが相互にリンクしているためだと思います。さて、私の質問は、これを回避するために、オブジェクトの1レベルよりも深くなるべきではないことを「Json」にどのように伝えることができるかということです。

4

4 に答える 4

8

myUserおそらくEntityFrameworkによって生成されたタイプです。

Jsonを返すと、フレームワークは基本的に各プロパティを準備し、SQLコマンドを実行してすべてのデータを遅延ロードします。

代わりに、EntityFrameworkにアタッチされていない具象プロパティを使用してViewModelクラスを準備し、そのオブジェクトを必要なだけ深く準備する必要があります。

于 2012-05-21T01:46:23.670 に答える
6

オブジェクトがそれ自体のいくつかのプロパティを持っている場合に発生する可能性があります。例えば。

public object Employee()
{
    string ID {get; set;}
    string Name {get; set;}
    int Age {get; set;}
    Employee Boss{get; set;} //<-- here
}

var employee = new Employee();
return Json(employee,JsonRequestBehavior.AllowGet); //The Boss property will cause "RecursionLimit exceeded".

それを避けるために。あなたはそのようなことをすることができます:

var employee = new Employee();
var prepareForJson = new {
    ID = employee.ID,
    Name = employee.Name,
    Age = employee.Age,
    Boss = employee.Boss.ID
};
return Json(prepareForJson , JsonRequestBehavior.AllowGet);
于 2012-05-21T01:58:58.683 に答える
3

web.configを使用して再帰の深さを構成できます

http://msdn.microsoft.com/en-us/library/bb763183.aspx

ただし、そもそも再帰が発生しないようにモデルを整理したいだけかもしれません。現在の状況で必要なデータの量を考えて、それだけを返します。

于 2012-05-21T01:46:50.500 に答える
0

Edison Chuangほとんどの場合の答えだと思います(シリアル化中にループを確実に引き起こすナビゲーションプロパティを持たない一部のサービスモデルにデータモデルをマッピングします)。

ただし、ほとんどのサービスモデルはデータモデル(EFモデル)のプロパティの多くを共有するため、AutoMapperを使用でき、特に多くのプロパティを持つオブジェクトのコードを大幅に簡素化できます。例えば:

// set up map
cfg.CreateMap<Employee, EmployeeSm>();

// use the map
var sm = Mapper.Map<EmployeeSm>(employee);
// this can be also set up during mapping configuration phase
sm.Boss = employee.Boss.ID;

シリアル化の深さがデフォルトの100を超えるというまれなケースでは、この制限を増やすか、Json.NETを使用してオブジェクトをシリアル化できます。

于 2018-03-14T08:04:25.783 に答える