Web Api使用Entity Framework僅從一個到多個關係返回一個子對象

asp.net-mvc entity-framework-core

我有一個控制器方法,必須返回帶有子集合的父對象。在調試中,我可以在執行期間看到很多孩子,但是當我抓住一個json時它只有一個孩子。

    [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/4160https://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 == Name ,它應該是Name == other.Name

哦,我們笑了......



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow