1

Entity Framework 4 を使用した MVC-3 (RC1) アプリケーションがあります。

コントローラー アクションから JSON オブジェクトを返したいと考えています。このオブジェクトは、明らかに参照を返す他のオブジェクトによって参照されます。

したがって、次の循環参照エラーが発生します。

「/」アプリケーションでサーバー エラーが発生しました。

タイプ 'Application.Models.ReferenceObject' のオブジェクトをシリアル化中に、循環参照が検出されました。

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.InvalidOperationException: タイプ 'Application.Models.ReferenceObject' のオブジェクトをシリアル化中に循環参照が検出されました。

NB: Application & ReferenceObjectは明らかに実際の名前空間 / オブジェクトの代替です。

Stack Overflow: Circular reference exception when serializing LINQ to SQL classesによると、これは JSON.Net を使用して克服できます。ただし、これを回避し、代わりにシリアル化されるオブジェクトから問題のある参照プロパティを除外しようとします。

どういう意味ですか?

私はこのようなことをしたい:

IList<ReferenceObject> list = Repository.GetReferenceObjects();
return Json(list.**<method>**("ObjectsReferencingThis"));

where**<method>**メソッドとは反対のことを行うObjectQuery(Of T).IncludeメソッドでありObjectsReferencingThis、循環参照の原因となっているプロパティです。

注意:これらのプロパティを削除したり、POCO を作成したりしたくはありません。これは Json のシリアル化にのみ影響するためです。

誰でも助けてください。

:)

4

2 に答える 2

2

以前のプロジェクトの1つで作業したときに、同様の問題が発生しました。これが私がやったことです:

IList<Product> list = Repository.GetProducts();
  var collection = products.Select(product => new
        {
            id = product.Id,
            name = product.Name,
            detailUrl = product.DetailUrl,
            imageLargeUrl = product.ThumbNailUrl,
            tagtitle = product.Name.ToUpper(),
            tagheader = "Words our cherished patrons use to describe this product",
            tagwords = from tag in product.Tags group tag by tag.Name into words select new { name =          words.Key, weight = words.Count() }
        });

 var result = new {id = inquiry.Id, products = collection, };
 return this.Jsonp(result);

Jsonの結果は次のようになります。

{
"id" : 2,
"products" : [{
    "id" : "3605970008857",
    "name" : "TITLE1",
    "detailUrl" : "http://www.urlhere.com",
    "tagwords" : [{
        "name" : "roses",
        "weight" : 1
    },
    {
        "name" : "cotton",
        "weight" : 1
    },
    {
        "name" : "happy",
        "weight" : 1
    }]
},
{
    "id" : "3605970019891",
    "name" : "TITLE2",
    "detailUrl" : "http://www.urlhere.com",
    "tagwords" : []
}],

}

参照したオブジェクトの他のプロパティを必要に応じて結果に追加して、Jsonオブジェクトに表示することもできます:)

于 2010-12-14T06:29:27.537 に答える
0

非常に大きなリストがある場合は推奨されない非常に簡単な解決策を作成しました

letters=UserOperations.GetDepartmentLettersForSecretary(pageNumber, pageSize,(Session["User"] as User).DepartmentID.Value, (Session["User"] as User).ID);

foreach (Letter letter in letters)
{
    letter.LetterStatus.Letters = null;
}

私の場合の問題はcircular referenceLetterStatus.Lettersにあるので、私Iterated through the listassigned it to null

私があなたに言ったようにnot recommended、あなたが持っているならvery big list

于 2016-09-26T17:40:18.180 に答える