EntityFrameworkCore+SQLite如何获取登录用户Id并存入变量
解决方案
你的代码存在几个明显的EF Core使用错误,按下面的方式调整即可实现需求。
原代码问题说明
Any()方法仅返回bool类型结果(表示是否存在匹配数据),无法直接返回用户Id,赋值给int类型变量会直接触发编译错误- 表达式
user.Id = UserID是赋值操作而非相等判断,且此时UserID变量尚未完成定义,属于非法调用 - 连续两次调用
Any()会重复访问数据库,属于不必要的性能开销 - 外层包裹的
foreach (var field in data)循环没有实际作用,单用户登录校验不需要遍历集合做重复匹配
登录时获取用户Id的正确写法
不需要分两次判断存在性再查Id,直接一次查询拿到匹配的用户实体即可,匹配成功后直接从实体中取主键Id:
// 查询用户名、密码匹配的用户,无匹配结果时返回null var matchedUser = context.User .FirstOrDefault(u => u.Name == UserName && u.Password == PassWord); if (matchedUser == null) { // 此处写登录失败逻辑,比如返回"用户名或密码错误"提示 return; } // 直接从匹配到的用户实体中取主键Id,无需二次查询 int currentUserId = matchedUser.Id; // 你可以把currentUserId存在会话、Cookie或者当前上下文变量中,供后续业务逻辑使用
新增训练记录时关联用户Id
后续给Workout表新增数据时,直接把之前拿到的currentUserId赋值给Workout实体对应的用户外键字段即可:
var newWorkoutRecord = new Workout { UserId = currentUserId, // 关联登录用户的Id // 其余字段按你的业务需求赋值,比如训练时长、训练类型、创建时间等 CreateTime = DateTime.Now, Duration = 60, Type = "有氧训练" }; context.Workout.Add(newWorkoutRecord); context.SaveChanges();
注意:实际业务中不要明文存储用户密码,建议存储加盐哈希后的密码值,登录时比对哈希结果即可,避免数据库泄露导致用户密码批量被盗。
内容的提问来源于stack exchange,提问作者Tris
相关产品推荐
相关产品推荐

