c# - 在 Entity Framework Core 中添加数据库后子模型列表为空

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

所以我正在试用 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) 和引用导航属性 (Site) 的依赖实体:

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 的创建操作中,以尝试与主体一起创建依赖项:

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

但是,在“详细信息” View 中,当我尝试显示已创建的位置时,列表始终为空:

<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

预先感谢您帮助解释我遗漏的内容!

编辑:根据要求,这是站点 Controller 中的详细信息操作的主体,它获取详细信息 View 的模型数据:

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

加载站点的模型数据以提供给 View 时。

感谢 Ivan 的解决方案!

关于c# - 在 Entity Framework Core 中添加数据库后子模型列表为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44348652/

相关文章:

c# - 用于测试目的的 amazon s3 开发者免费帐户

c# - 为当前 session 刷新经过身份验证的用户的个人资料数据的最简单方法

c# - 在 ASP.NET Core 中也延迟加载后虚拟属性未加载

c# - EF Core 嵌套的 Linq 选择结果在 N + 1 个 SQL 查询中

c# - Stopwatch.IsHighResolution == false 在我的机器上。为什么?

c# - 我必须处理 SQLiteCommand 对象吗?

c# - 在 MS SQL Server 2008 中加入 "best"匹配的好方法是什么?

c# - ASP.Net MVC - 带集合的模型,提交

c# - 在 C# 中通过字符串获取成员?

c# - Entity Framework Core 原始 SQL 错误 : System. ArgumentException 已添加具有相同键的项目。关键:身份证