如何将List<object>数据插入数据库并为每个列表值生成独立记录
解决方案:批量创建独立的Schedule记录
看起来你需要把选中的日、月、周几这些列表值,每个都生成对应的定时任务记录,同时复用相同的时分秒、重复规则、任务ID和用户ID对吧?我来帮你调整代码解决这个问题。
问题核心分析
你当前的代码只创建了一个Schedule对象,就算遍历列表修改字段,也只是更新同一个对象的属性,最终只会插入一条记录。要实现每个列表元素对应一条独立记录,必须为每个元素生成全新的Schedule实例。
修改后的控制器代码
[HttpPost] public ActionResult ScheduleInfo(Values model, int JobList1, string Second, string Minute, string Hour, object DayOfMonth, object Month, object DaysOfWeek, int repeatTime) { var secondCon = Convert.ToInt32(Second); var minuteCon = Convert.ToInt32(Minute); var hourCon = Convert.ToInt32(Hour); model.Job = JobList1; model.Second = secondCon; model.Minute = minuteCon; model.Hour = hourCon; model.DayOfMonth = new List<object>(); model.Month= new List<object>(); model.DaysOfWeek = new List<object>(); // 收集选中的每月日期 foreach (var dofm in model.DofMInfo) { if (dofm.IsChecked) { model.DayOfMonth.Add(dofm.DofMID); } } // 收集选中的月份 foreach (var month in model.MonthInfo) { if (month.IsChecked) { model.Month.Add(month.monthID); } } // 收集选中的星期几 foreach (var day in model.DayInfo) { if (day.IsChecked) { model.DaysOfWeek.Add(day.dayID); } } model.repeatTime = repeatTime; try { // 使用using自动释放数据库上下文,避免资源泄漏 using (ScheduleEntity db = new ScheduleEntity()) { // 先提取公共字段,避免循环里重复赋值 var userId = User.Identity.GetUserId(); var commonSecond = Convert.ToString(model.Second); var commonMinute = Convert.ToString(model.Minute); var commonHour = Convert.ToString(model.Hour); var commonRepeat = model.repeatTime; var commonJobId = model.Job; // 为每个选中的"每月日期"创建独立记录 foreach (var dayOfMonthVal in model.DayOfMonth) { var sched = new Schedule { Second = commonSecond, Minute = commonMinute, Hour = commonHour, DayOfMonth = Convert.ToString(dayOfMonthVal), Month = null, // 按日期触发时,其他维度字段设为null(根据数据库规则调整,允许空就用null,否则用空字符串) DayOfWeek = null, Repeat = commonRepeat, JobId = commonJobId, AspNetUsersId = userId }; db.Schedules.Add(sched); } // 为每个选中的"月份"创建独立记录 foreach (var monthVal in model.Month) { var sched = new Schedule { Second = commonSecond, Minute = commonMinute, Hour = commonHour, Month = Convert.ToString(monthVal), DayOfMonth = null, DayOfWeek = null, Repeat = commonRepeat, JobId = commonJobId, AspNetUsersId = userId }; db.Schedules.Add(sched); } // 为每个选中的"星期几"创建独立记录 foreach (var dayOfWeekVal in model.DaysOfWeek) { var sched = new Schedule { Second = commonSecond, Minute = commonMinute, Hour = commonHour, DayOfWeek = Convert.ToString(dayOfWeekVal), DayOfMonth = null, Month = null, Repeat = commonRepeat, JobId = commonJobId, AspNetUsersId = userId }; db.Schedules.Add(sched); } // 一次性提交所有记录,减少数据库交互次数 db.SaveChanges(); } } catch (Exception ex) { // 建议这里加日志记录,方便后续排查问题,而不是直接抛出原始异常 // Logger.Error(ex, "创建定时任务记录失败"); throw ex; } return RedirectToAction("SchedulerIndex"); }
关键修改说明
- 每个列表元素对应新实例:循环中每次创建全新的
Schedule对象,确保每个选中的日/月/周几都能生成独立的数据库记录。 - 公共字段复用:把时分秒、重复规则这些固定值提前提取,避免循环内重复计算,让代码更简洁。
- 批量提交优化:所有记录添加完成后再调用一次
SaveChanges(),比循环里每次提交更高效。 - 上下文资源管理:用
using包裹数据库上下文,确保使用后自动释放资源。
额外小建议
- 如果你的业务需要组合多个维度(比如选中了1号和3月,要生成"3月1号"的记录),可以用嵌套循环生成所有组合的实例。
- 数据库字段如果不允许空值,把
null改成空字符串""即可。 - 异常处理里加个日志,后续排查问题会方便很多。
内容的提问来源于stack exchange,提问作者MO MI
相关产品推荐
相关产品推荐

