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

C# Web API开发任务管理系统如何配置SQL中Subtask表外键关联

具体调整方案

1. 实体类补充一对多关联

你当前的主任务和子任务实体没有建立外键关联,需要补充导航属性和外键字段:

调整后Task.cs

public class Task
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime FinishDate { get; set; }        
    public string Status { get; set; }
    // 新增:关联子任务导航属性
    public List<SubTask> SubTasks { get; set; } = new();
}

调整后SubTask.cs

public class SubTask
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Status { get; set; }
    // 新增:关联主任务外键
    public int TaskId { get; set; }
    // 新增:关联主任务导航属性
    public Task Task { get; set; }
}

调整后执行EF Core迁移,会自动在SubTask表生成TaskId外键约束,建立主任务和子任务的一对多关联。

2. 调整DTO适配请求响应

需要在DTO中新增子任务列表字段,同时补充SubTask对应的DTO:

新增SubTaskDto.cs

public class SubTaskDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Status { get; set; }
}

调整后TaskDto.cs

public class TaskDto
{        
    public int Id { get; set; }        
    public string Name { get; set; }        
    public string Description { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime FinishDate { get; set; }
    public string Status { get; set; }
    // 新增:可选子任务列表,不传的话默认是空列表
    public List<SubTaskDto> SubTasks { get; set; } = new();
}

3. 调整POST创建逻辑

接收前端传入的TaskDto后,映射为Task实体时同步处理子任务:

  • 如果传入了SubTasks字段,EF Core会自动将子任务数据插入SubTask表,且自动绑定TaskId关联到新建的主任务
  • 如果未传SubTasks字段,会保留默认空列表,不创建子任务,满足可选要求
    示例代码片段:
[HttpPost]
public async Task<IActionResult> CreateTask([FromBody] TaskDto taskDto)
{
    // DTO映射为实体,手动映射或用AutoMapper均可
    var task = new Task
    {
        Name = taskDto.Name,
        Description = taskDto.Description,
        StartDate = taskDto.StartDate,
        FinishDate = taskDto.FinishDate,
        Status = taskDto.Status,
        // 映射子任务
        SubTasks = taskDto.SubTasks.Select(s => new SubTask
        {
            Name = s.Name,
            Status = s.Status
        }).ToList()
    };
    _context.Tasks.Add(task);
    await _context.SaveChangesAsync();
    // 返回生成的Id等信息
    taskDto.Id = task.Id;
    return Ok(taskDto);
}

4. 调整GET查询逻辑

查询主任务时需要显式加载关联的子任务,否则EF Core默认不会返回关联数据:

[HttpGet("{id}")]
public async Task<IActionResult> GetTask(int id)
{
    // 用Include显式加载关联子任务
    var task = await _context.Tasks
        .Include(t => t.SubTasks)
        .FirstOrDefaultAsync(t => t.Id == id);
    if (task == null) return NotFound();
    // 实体映射为DTO,包含子任务列表
    var taskDto = new TaskDto
    {
        Id = task.Id,
        Name = task.Name,
        Description = task.Description,
        StartDate = task.StartDate,
        FinishDate = task.FinishDate,
        Status = task.Status,
        SubTasks = task.SubTasks.Select(s => new SubTaskDto
        {
            Id = s.Id,
            Name = s.Name,
            Status = s.Status
        }).ToList()
    };
    return Ok(taskDto);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:24:06