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

.NET Identity 无需控制器将aspnetusers的UserId插入自定义表

实现方案

你不需要在控制器层传递UserId,直接在服务层通过依赖注入获取当前请求上下文的登录用户信息,即可完成ClientId字段赋值,具体操作如下:

前置配置

首先在Program.cs中注册HTTP上下文访问服务,用于在非控制器层获取当前登录用户信息:

// 注册IHttpContextAccessor
builder.Services.AddHttpContextAccessor();

服务层代码修正

  1. 给你的服务实现类注入三个依赖:数据库上下文ApplicationDbContext、用户管理服务UserManager<ApplicationUser>、HTTP上下文访问器IHttpContextAccessor
  2. 修复原代码中的变量名冲突、笔误问题(原代码混用WorkOutItem、invoice变量,会直接导致编译失败)
  3. 通过UserManager配合HTTP上下文拿到当前登录用户Id,直接赋值给ClientId外键字段即可

完整可运行代码:

public class WorkoutServices : IWorkoutServices
{
    private readonly ApplicationDbContext _context;
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly IHttpContextAccessor _httpContextAccessor;

    // 构造函数注入依赖,无需控制器传参
    public WorkoutServices(
        ApplicationDbContext context,
        UserManager<ApplicationUser> userManager,
        IHttpContextAccessor httpContextAccessor)
    {
        _context = context;
        _userManager = userManager;
        _httpContextAccessor = httpContextAccessor;
    }

    public async Task<WorkOutItems> CreateTodo(WorkOutItems WorkOutItem)
    {
        // 获取当前登录用户信息
        var currentUser = await _userManager.GetUserAsync(_httpContextAccessor.HttpContext.User);
        if (currentUser == null)
        {
            throw new UnauthorizedAccessException("请先登录再操作");
        }

        var newWorkOutItem = new WorkOutItems();
        newWorkOutItem.ItemName = "Computer";
        newWorkOutItem.CountOfItemName = 500;
        newWorkOutItem.ClientId = currentUser.Id; // 直接赋值用户Id即可

        _context.WorkOutItems.Add(newWorkOutItem);
        await _context.SaveChangesAsync();
        return newWorkOutItem;
    }

    // 其余接口方法实现略
    public Task<List<WorkOutItems>> getTodoList() => throw new NotImplementedException();
    public Task<WorkOutItems> GetToDoListById(int id) => throw new NotImplementedException();
    public Task UpdatePlayer(WorkOutItems TodoItems) => throw new NotImplementedException();
    public Task DeletePlayer(WorkOutItems TodoItems) => throw new NotImplementedException();
}

注意事项

  • 实体中的Client导航属性不需要手动赋值,EF Core会自动根据ClientId外键维护表关联关系,查询时调用Include(w => w.Client)即可加载关联的AspNetUsers用户数据
  • 整个逻辑完全在服务层闭环,不需要控制器额外传递用户参数,符合你的需求
  • 原代码中方法参数和内部实例化对象重名、使用未定义的invoice变量属于低级笔误,编写时注意变量命名避免这类编译错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 20:42:20