數據庫添加到實體框架核心後,子模型列表為空

asp.net-mvc c# entity-framework-core

所以我正在嘗試實體框架核心,我的第一對關係模型遇到了麻煩。我正在嘗試使用約定來形成關係,如下所示:

主體實體,具有傳統的主鍵(Id)和集合導航屬性(位置列表):

public class Site
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public int LocationCount { get; set; } = 1;
    public List<Location> Locations { get; set; } = new List<Location>();
}

依賴實體,具有常規外鍵(SiteId)和引用導航屬性(站點):

public class Location
{
    public int Id { get; set; }
    public int SiteId { get; set; }
    public Site Site { get; set; }
    public int AreaCount { get; set; } = 1;
    public Location(Site site) { SiteId = site.Id; }
}

由於我希望每個站點至少有一個位置,因此我將其放在SiteController的Create操作中,以嘗試創建依賴項和主體:

[HttpPost]
public IActionResult Create(Site site)
{
    _context.Sites.Add(site);
    for (int i = 0; i < site.LocationCount; i++)
        _context.Locations.Add(new Location(site));
    _context.SaveChanges();
    return RedirectToAction("Details", new { Name = site.Name });
}

但是,在“詳細信息”視圖中,當我嘗試顯示已創建的位置時,列表始終為空:

<h2>@Model.Locations.Count Locations</h2>    
@foreach (Location l in Model.Locations)
{
    <div class="row">
        <div class="col-sm-12">@l.Id</div>
    </div>
}

結果如下:

0 Locations

提前感謝您提供幫助,解釋我錯過的內容!

編輯:根據請求,這裡是站點控制器中詳細信息操作的主體,它獲取詳細信息視圖的模型數據:

public IActionResult Details(string name)
{
    var model = _context.Sites.FirstOrDefault(a => a.Name == name);
    if (model == null) model = new Site();
    return View(model);
}

另外,根據一個建議,我修復了在Site.Id之前設置Location.SiteId的問題,因為在調用SaveChanges()之前,不會自動在網站上生成Id。不幸的是,結果(空位置列表)仍然是相同的:

[HttpPost]
public IActionResult Create(Site site)
{
    int nextsiteid = _context.Sites.Count() + 1;
    _context.Sites.Add(site);
    for (int i = 0; i < site.LocationCount; i++)
        _context.Locations.Add(new Location(siteid));
    _context.SaveChanges();
    return RedirectToAction("Details", new { Name = site.Name });
}

並將Location構造函數更改為使用Id而不是實例:

public Location(int siteid) { SiteId = siteid; }

在此先感謝任何進一步的建議!

一般承認的答案

我只是在轉錄我給出的答案,這是在原帖的評論中提供的,所以任何閱讀帖子的人都可以輕鬆找到答案。

問題非常簡單,EF Core還不支持延遲加載。因此,當填充Site實體時,它不會懶惰地將依賴位置列表加載到集合導航屬性中。

修復是使用預先加載,通過以下方式:

var model = _context.Sites.Include(s => s.Locations).FirstOrDefault(a => a.Name == name);

加載站點的模型數據以提供給視圖時。

謝謝你的解決方案,伊万!


熱門答案

如果延遲加載是真的。無需循環或導航其子項。它將拯救你的父母以及它的孩子。確保你得到父母及其孩子

[HttpPost]
public IActionResult Create(Site site)
{  // debug here are you getting parent & its child ?
_context.Sites.Add(site);
   // for (int i = 0; i < site.LocationCount; i++)  // No need of it
   // _context.Locations.Add(new Location(site));   // No need of it
_context.SaveChanges();
return RedirectToAction("Details", new { Name = site.Name });
}

更新:如果這兩個表相互鏈接,並且您手動嘗試添加位置表。讓我給你一個簡單的,希望這會對​​你有所幫助

[HttpPost]
public IActionResult Create(Site site)
{  // debug here are you getting parent & its child ?
_context.Sites.Add(site);
   // get the last added site id

   int? maxId=
  _context.Sites.orderbyDecending(x=>x.SiteId).FirstorDefault(x=>x.SiteId);// may be in this line typing mistake , you change it according to linq
    foreach(var i in site.Location) 
    {
      // in this loop traverse the child array and override the foreign key id with last added id
       i.SiteId =maxId;
      _context.Locations.Add(i);
    }

_context.SaveChanges();
return RedirectToAction("Details", new { Name = site.Name });
}


Related

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