2017-06-03 54 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

相关问题