You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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");
}

关键修改说明

  1. 每个列表元素对应新实例:循环中每次创建全新的Schedule对象,确保每个选中的日/月/周几都能生成独立的数据库记录。
  2. 公共字段复用:把时分秒、重复规则这些固定值提前提取,避免循环内重复计算,让代码更简洁。
  3. 批量提交优化:所有记录添加完成后再调用一次SaveChanges(),比循环里每次提交更高效。
  4. 上下文资源管理:用using包裹数据库上下文,确保使用后自动释放资源。

额外小建议

  • 如果你的业务需要组合多个维度(比如选中了1号和3月,要生成"3月1号"的记录),可以用嵌套循环生成所有组合的实例。
  • 数据库字段如果不允许空值,把null改成空字符串""即可。
  • 异常处理里加个日志,后续排查问题会方便很多。

内容的提问来源于stack exchange,提问作者MO MI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:36:04