ASP.NET Core 3.1中关联导航属性为空,无法在视图显示创建公司的用户名
UserNavigation导航属性始终为null,和Company类构造函数缺失代码没有关联,不需要在构造函数中补充相关逻辑。
核心原因是ASP.NET Core 3.1 内置的EF Core 默认查询行为:查询实体时仅拉取当前实体对应表的字段,不会主动关联查询关联表的导航属性数据。控制器中直接将_dbContext.Company的DbSet结果传给视图,未触发关联表查询逻辑,因此导航属性始终为null。
构造函数逻辑校验:Company类构造函数的正确职责仅为初始化集合类型的导航属性(如
Accounts、CompanyHistory这类一对多的集合属性),对于单引用类型的导航属性(如UserNavigation),本身设计为可空,不需要在构造函数中初始化。
列表页最优解决方案
在控制器查询公司数据时,通过Include方法显式预加载关联的用户导航属性,一次性完成连表查询,修改后的控制器代码:
public IActionResult ViewCompanies() { var companyList = _dbContext.Company .Include(company => company.UserNavigation) .ToList(); return View(companyList); }
该方式仅触发一次数据库连表查询,无额外性能损耗,完全匹配列表页的数据查询需求。
视图代码修正
原视图代码存在路由参数错误:a标签中asp-route-id="@item.User"对应的属性在Company模型中不存在,需要替换为模型实际的外键字段UserID,否则点击用户名跳转用户详情页时会出现路由参数错误。修正后的视图片段:
<td> <a asp-route-id="@item.UserID" asp-controller="User" asp-action="Details">@item.UserNavigation?.Name</a> </td>
不推荐的替代方案
全局懒加载:通过安装懒加载扩展包、在数据库上下文注册时开启全局懒加载功能,EF会在代码首次访问导航属性时自动发起查询补全数据。但在列表页循环遍历每条公司记录、访问导航属性的场景下,会触发N次额外数据库查询(即N+1查询问题),性能损耗极高,不适合列表类页面使用。
内容的提问来源于stack exchange,提问作者Borko Djurovic

