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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:12:38