ASP.NET Core 6+EF实现员工请假申请插入并更新IsCurrent状态
实现方案
你只需要在创建新请假记录的逻辑中,先查询并更新该员工的最后一条请假记录,再插入新记录即可。具体修改如下:
修改后的CreateAsync方法代码
public async Task<GenericResponseDto<LeaveResponseDto>> CreateAsync(LeaveRequestDto request) { var response = new GenericResponseDto<LeaveResponseDto>(); var employee = await _context.Employees.FirstOrDefaultAsync(e => e.Id == request.EmployeeId); if (employee == null) { response.Error = new ErrorResponseDto() { ErrorCode = 404, Message = "Employee does not exist in the system!" }; response.StatusCode = 404; return response; } try { // 1. 查询该员工的最后一条请假记录(按Id倒序,因Id是自增标识,能保证最新) var lastEmployeeLeave = await _context.EmployeeLeaves .Where(l => l.Employee.Id == request.EmployeeId) .OrderByDescending(l => l.Id) .FirstOrDefaultAsync(); // 2. 如果存在有效记录,将其IsCurrent设为false if (lastEmployeeLeave != null && lastEmployeeLeave.IsCurrent == true) { lastEmployeeLeave.IsCurrent = false; } // 3. 创建新的请假记录并设置IsCurrent为true var newLeave = _mapper.Map<EmployeeLeave>(request); newLeave.Employee = employee; newLeave.IsCurrent = true; _context.EmployeeLeaves.Add(newLeave); await _context.SaveChangesAsync(); response.Result = _mapper.Map<LeaveResponseDto>(newLeave); response.StatusCode = 201; } catch (Exception ex) { response.Error = new ErrorResponseDto() { ErrorCode = 500, Message = ex.Message }; response.StatusCode = 500; } return response; }
关键说明
- 查询最新记录:这里用
OrderByDescending(l => l.Id)是因为你的Id是自增Guid(DatabaseGeneratedOption.Identity),倒序后第一条就是最新创建的记录。如果模型里有专门的创建时间字段(比如CreateDateTime),用它排序会更准确。 - 原子性保证:EF的
SaveChangesAsync()是原子操作,更新旧记录和插入新记录会在同一个数据库事务中完成,要么全部成功,要么全部回滚,不会出现数据不一致的情况。 - 避免无效更新:增加
lastEmployeeLeave.IsCurrent == true的判断,仅对当前标记为有效的记录做修改,避免重复设置false。
内容的提问来源于stack exchange,提问作者Ayobamilaye
相关产品推荐
相关产品推荐

