Web Apiは、Entity Frameworkを使用して、1つの子オブジェクトのみを1つから複数の関係に戻します

asp.net-mvc entity-framework-core

質問

私は子供のコレクションで親オブジェクトを返さなければならないコントローラメソッドを持っています。デバッグでは、実行中にたくさんの子どもを見ることができますが、jsonを捕まえたときには子供は1人しかいません。

    [Route("api/page/{id}")]
    public JsonResult GetPage(int id)
    {
        var item = db.Pages.Include(p => p.PageContainerTemplates)
            .SingleOrDefault(p => p.Id == id);
        return Json(item);
    }

私は多くの子供を持っているし、エンティティフレームワークコアはそれらをすべて得るが、応答jsonはこのように見える:

{
  "name": "Index",
  "bodyClasses": "full-width-container transparent-header",
  "title": "Index",
  "pageContainerTemplates": [
    {
      "position": 8,
      "pageId": 1
    }
  ]
}

親オブジェクトは次のようになります。

public class Page : BaseEntity
{
    public string Name { get; set; }
    public string BodyClasses { get; set; }
    public string Title { get; set; }
    public virtual List<PageContainerTemplate> PageContainerTemplates { get; set; } 
}

そして子供はこのように見えます:

public class PageContainerTemplate : BaseEntity
{
    public int Position { get; set; }
    public int PageId { get; set; }
    public Page Page { get; set; }
    public int ContainerTemplateId { get; set; }
    public ContainerTemplate ContainerTemplate { get; set; }
}

私は追加の関係や代替キーを持っていないが、奇妙なのはjsonの私の唯一の子が "containerTemplateId"属性を持たない

受け入れられた回答

これを試して:

services.AddMvc().AddJsonOptions(options => {
            options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        });

この問題については、 https://github.com/aspnet/Mvc/issues/4160およびhttps://github.com/aspnet/EntityFramework/issues/4646も参照してください


人気のある回答

私は同じ問題を抱えていたが、ここで受け入れられた答えは私にとってはうまくいかなかった。

私にとっては、子オブジェクトの等価関数のバグであることが判明しました。

私の場合、子オブジェクトはIEquatable<T>実装しています。 bool Equals(T other)の実装では、親のIDプロパティとアイテムの名前を比較していました:

...
public bool Equals(Foo other) {
    if (other == null) return false;

    return ParentId == foo.ParentId && Name == Name;
}

バグはName == NameName == other.Nameです。

ああ、どうやって笑った...



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ