ASP.NET Core访问Azure SQL表获取用户专属跳转链接报错如何解决?
问题根因
DbSet.Find() 方法的入参是对应表的主键值,你的UserLinks表主键是Post_ID,并非和用户表关联的UserID字段。你传入user.Id调用Find(),实际是查找Post_ID = user.Id的记录,找不到就返回null,访问null对象的Link属性就触发了SqlNullValueException。
正确实现方式
修改Login Post方法里的跳转逻辑:
- 用
Where条件匹配UserID字段查询对应用户的链接记录 - 统一使用异步查询和现有代码风格对齐
- 增加空值判断避免异常
- 注意:如果
Link字段存的是完整URL路径(如/User/Personal/xxx),请用Redirect()而非RedirectToAction(),后者是专门用来接收控制器Action名称做路由跳转的方法。
注意:需要提前引入
Microsoft.EntityFrameworkCore命名空间,才能调用FirstOrDefaultAsync异步查询扩展方法。
修改后的代码片段:
if (user != null) { await Authenticate(model.Email); // 按UserID查询对应的链接记录 var userLink = await db2.UserLinks.FirstOrDefaultAsync(ul => ul.UserID == user.Id); if (userLink != null) { // 如果Link存的是路径,用Redirect return Redirect(userLink.Link); // 如果Link存的确实是Action名称,再用下面这句 // return RedirectToAction(userLink.Link); } // 没有匹配到链接的话跳转到默认页 return RedirectToAction("Index", "Home"); }
额外优化建议
- 不要明文存储用户密码,建议使用BCrypt等哈希算法对密码做哈希后再入库,避免数据库泄露导致用户账号失窃
UserContext和UserLinkContext可以合并为同一个DbContext,不用分开维护两个上下文实例- 登录写Claims的时候可以把
UserId也存到Claims里,后续需要获取用户ID时不用再查数据库,直接从User.Claims里读取即可
内容的提问来源于stack exchange,提问作者witchgen
相关产品推荐
相关产品推荐

