.NET Core与传统ASP.NET MVC子记录关联查询差异排查
问题分析与解决方案
你的问题根源在于Entity Framework Core(EF Core)和传统EF6的默认行为差异:传统ASP.NET MVC使用的EF6默认开启了延迟加载,当你访问item.Team1.TeamDescription时,EF会自动去数据库拉取关联的Team数据;但EF Core默认关闭了延迟加载,且你当前代码也没有显式加载子表的关联数据,所以TeamNavigation为null,导致描述显示为空。
下面给出两种可行的解决方案:
方法一:显式加载子表的关联数据(推荐,性能更可控)
在控制器查询ServiceRequests时,不仅要IncludeTeamAssignmentHistories,还要用ThenInclude加载这个集合中每个元素的TeamNavigation关联。修改后的控制器代码如下:
// GET: ServiceRequests/Details/5 public async Task<IActionResult> Details(int? id) { if (id == null) { return NotFound(); } var serviceRequests = await _context.ServiceRequests .Include(s => s.MemberNavigation) .Include(s => s.PriorityNavigation) .Include(s => s.RequestTypeNavigation) .Include(s => s.RequestTypeStepNavigation) .Include(s => s.StatusNavigation) .Include(s => s.TeamNavigation) .Include(s => s.FileDetails) .Include(s => s.ServiceRequestNotes) .Include(s => s.StepHistories) // 修改此处:用ThenInclude加载TeamAssignmentHistories的关联TeamNavigation .Include(s => s.TeamAssignmentHistories) .ThenInclude(t => t.TeamNavigation) .Include(s => s.IndividualAssignmentHistories) .AsNoTracking() .SingleOrDefaultAsync(m => m.Id == id); if (serviceRequests == null) { return NotFound(); } return View(serviceRequests); }
修改后EF Core会在关联查询中把TeamAssignmentHistories和对应的TeamNavigation数据一起加载,视图就能正常显示TeamDescription了。
方法二:开启延迟加载(适合需多处延迟加载的场景)
如果你希望和EF6一样自动延迟加载关联数据,需要满足两个条件:
- 修改模型,给导航属性添加virtual关键字:
namespace ServeMeHRCore21.Models { public partial class TeamAssignmentHistories { // 其他属性保持不变 // 为导航属性添加virtual关键字 public virtual ServiceRequests ServiceRequestNavigation { get; set; } public virtual Teams TeamNavigation { get; set; } } }
- 在DbContext中启用延迟加载代理:
在你的DbContext的OnConfiguring方法中添加UseLazyLoadingProxies()配置:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder .UseSqlServer("你的数据库连接字符串") .UseLazyLoadingProxies(); // 开启延迟加载 } }
开启后,当你在视图中访问item.TeamNavigation.TeamDescription时,EF Core会自动查询对应Team数据,但要注意这种方式可能引发N+1查询问题(每个TeamAssignmentHistory都会触发一次单独查询),数据量较大时更推荐方法一的显式加载。
内容的提问来源于stack exchange,提问作者Lyndon Sundmark
相关产品推荐
相关产品推荐

