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
相关产品推荐
相关产品推荐

