2017-06-03 56 views
1

所以我嘗試了實體框架核心,並且遇到了第一對關係模型的問題。我試圖使用慣例形成的關係,具體如下:數據庫添加實體框架核心後,子模型列表爲空

的主要實體,與傳統的主鍵(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的創建行動,嘗試創建依賴關係與校長一起TS:

[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 }); 
} 

,改變了位置構造函數使用ID而不是實例:

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

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

+0

如何從視圖中獲取數據? –

+0

@AsifRaza我不確定我是否理解這個問題。你的意思是我如何從站點視圖獲取站點數據?只是通常的方式,聲明模型,填寫表單,並通過HttpPost將其提交給我在上面顯示的Create方法。不過,這些孩子不是通過創建視圖創建的。我只想在創建網站時創建一個或多個位置依賴項的「默認」實例。所以該位置沒有視圖。 – Jason

+0

好吧,你只是傳遞父值,因爲你正在添加子數據我是對的 –

回答

1

我只是抄寫,我給出了答案,這是在原崗位的評論能力,這使得它可以很容易地被任何人發現閱讀帖子。

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

的解決辦法是使用預先加載,途經:

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

當加載網站的模型數據提供給視圖。

感謝您的解決方案,伊萬!

0

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

[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 }); 
} 
+0

感謝您的回覆。是的,我記得讀到默認情況下延遲加載是真實的,所以我想我不需要手動將代理添加到主體。但我不確定您的解決方案實際上是如何將新的位置行添加到數據庫中的位置表。這是否會發生在Site模型的某個地方? _context.Locations.Add(LocationInstance)在哪裏去? – Jason

+0

_context.Locations.Add(LocationInstance)去哪裏?那麼它什麼也沒有做,因爲如果你連接兩個,那麼你需要添加網站的主要位置表,我希望你明白 - –

+0

哦,我明白了。所以問題在於Site ID值還沒有設置,可能是因爲在SaveChanges()期間發生了?所以當我將該網站傳入位置構造函數並設置網站標識時,它沒有獲得該值?這就說得通了!我會測試這個!感謝您擴大您的解釋! – Jason

相關問題