EF6 CodeFirst连接现有SQLServer数据库遇ArgumentNullException问题求助
解决EF6 CodeFirst连接现有数据库时的ArgumentNullException问题
首先看你遇到的System.ArgumentNullException: Value cannot be null. Parameter name: source异常,根源很明确:你的HomePageModel实例的UpcommingMeetings和PassedMeetings属性根本没被赋值,默认是null,当视图里调用Model.UpcommingMeetings.Any()时,Any()这个LINQ扩展方法的source参数(就是你的集合)是null,自然就抛出这个异常了。
修复步骤
1. 修改控制器代码,赋值模型属性
你当前的控制器只是创建了HomePageModel的空实例,但没有把查询出来的upcomingMeetings和passedMeetings赋值给它的对应属性。修改后的控制器代码应该是这样:
public ActionResult Index() { var meetings = db.Meetings .OrderBy(e => e.StartDate) .Where(e => e.IsPublic) .Select(e => new MeetingViewModel() { MeetingId = e.MeetingId, MeetingName = e.MeetingName, MeetingTypeName = e.MeetingType?.Name, // 加空传播运算符,避免MeetingType为null时报错 LocationName = e.MeetingLocation?.Name, // 同理处理MeetingLocation StartDate = e.StartDate, }); var upcomingMeetings = meetings.Where(e => e.StartDate > DateTime.Now); var passedMeetings = meetings.Where(e => e.StartDate <= DateTime.Now); // 关键:把查询结果赋值给模型的属性 var model = new HomePageModel() { UpcommingMeetings = upcomingMeetings.ToList(), // 转为List避免重复执行EF查询 PassedMeetings = passedMeetings.ToList() }; return View(model); // 把赋值后的模型传给视图 }
2. 额外优化与预防
- 我在
MeetingTypeName和LocationName那里加了?.空传播运算符,因为如果现有数据库里存在MeetingType或MeetingLocation为null的记录,直接访问.Name会触发另一个空引用异常,这是提前预防。 - 调用
.ToList()是为了让EF立即执行查询,否则upcomingMeetings和passedMeetings是延迟加载的IQueryable,会在视图里执行两次数据库查询,影响性能。 - 确认视图里的模型声明
@model AquaEvent.Common.HomePageModel命名空间正确,避免模型接收错误。
问题核心复盘
你原来的控制器代码里,return View(HomeIndex, new HomePageModel());创建的是完全空的模型实例,两个集合属性保持默认的null状态。而LINQ的Any()扩展方法要求传入的数据源(source参数)不能为null,所以视图执行到Model.UpcommingMeetings.Any()时直接抛出了异常。
内容的提问来源于stack exchange,提问作者hitasp
相关产品推荐
相关产品推荐

