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

在C#中保存TemplateMaster后自动创建TemplateDetail记录的实现方案

实现思路与代码示例

模型修正(补充关联关系)

首先需要完善TemplateDetail模型,添加与TemplateMaster的关联外键,保证数据关联的一致性,同时建议增加主键字段:

public class TemplateMaster
{
    public int TemplateId { get; set; }
    public string TemplateName { get; set; }
    public DateTime StartDateTime { get; set; }
    public DateTime FinishDateTime { get; set; }
    public double DurationHours { get; set; }
}

public class TemplateDetail
{
    public int Id { get; set; } // 主键,符合数据库设计规范
    public int TemplateId { get; set; } // 关联TemplateMaster的外键
    public DateTime TheDateTime { get; set; }
    public string TheNumbers { get; set; }

    // 可选导航属性,方便EF Core关联查询
    public TemplateMaster TemplateMaster { get; set; }
}

核心实现方案

1. 触发时机选择

推荐采用应用层业务逻辑触发,这种方式更易维护和调试,也便于扩展规则:

  • 在新增TemplateMaster记录并保存到数据库后,立即生成对应的TemplateDetail批量插入。
  • 也可根据场景选择EF Core拦截器(重写SaveChangesAsync)或数据库触发器,但应用层触发是最直观的方案。

2. 时间序列生成逻辑

根据给定的StartDateTime、FinishDateTime和DurationHours,结合示例中的工作时段过滤规则(仅生成每日08:00-10:00的记录),生成符合要求的时间点序列:

public class TemplateService
{
    private readonly AppDbContext _dbContext;
    // 可配置的工作时段,示例为每日08:00-10:00
    private readonly TimeSpan _workStart = new TimeSpan(8, 0, 0);
    private readonly TimeSpan _workEnd = new TimeSpan(10, 0, 0);

    public TemplateService(AppDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public async Task CreateTemplateWithDetailsAsync(TemplateMaster master)
    {
        // 1. 保存主记录到数据库
        _dbContext.TemplateMasters.Add(master);
        await _dbContext.SaveChangesAsync();

        // 2. 计算时间间隔,生成所有符合要求的明细记录
        var interval = TimeSpan.FromHours(master.DurationHours);
        var currentTime = master.StartDateTime;
        var details = new List<TemplateDetail>();
        int sequenceNumber = 1;

        while (currentTime <= master.FinishDateTime)
        {
            // 过滤非工作时段的时间点
            var timeOfDay = currentTime.TimeOfDay;
            if (timeOfDay >= _workStart && timeOfDay <= _workEnd)
            {
                details.Add(new TemplateDetail
                {
                    TemplateId = master.TemplateId,
                    TheDateTime = currentTime,
                    TheNumbers = sequenceNumber.ToString()
                });
                sequenceNumber++;
            }

            // 累加时间间隔,进入下一个时间点
            currentTime = currentTime.Add(interval);
        }

        // 3. 批量插入明细记录
        if (details.Any())
        {
            _dbContext.TemplateDetails.AddRange(details);
            await _dbContext.SaveChangesAsync();
        }
    }
}

// 对应的DbContext定义
public class AppDbContext : DbContext
{
    public DbSet<TemplateMaster> TemplateMasters { get; set; }
    public DbSet<TemplateDetail> TemplateDetails { get; set; }

    // 构造函数、数据库配置等省略
}

3. 关键注意事项

  • 时区一致性:确保所有时间字段使用统一时区(如UTC或业务所属时区),避免时间偏移问题。
  • 性能优化:如果生成的明细记录数量极大,建议分批次插入数据库,避免单次插入压力过大。
  • 数据一致性:数据库层面给TemplateDetail.TemplateId添加外键约束,防止出现无关联的明细记录。
  • 规则可配置:将工作时段、时间间隔规则抽离为可配置项,方便后续业务调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:40:30