通过SQL语句更新Asp.Net Claims:为现有用户添加声明失败求助
问题分析与修复方案
首先,你的查询存在几个关键问题,导致它要么执行结果不符合预期,要么直接报错,我来逐一拆解:
1. 核心错误:UserId 赋值逻辑错误
AspNetUserClaims 表中的 UserId 字段是外键,关联的是 AspNetUsers 表的主键 Id(通常是GUID或整数类型),而不是 UserName(字符串类型)。你把 f.UserName 赋值给 UserId,要么会因为数据类型不匹配报错,要么会破坏外键关联,导致这条声明无法正确关联到用户。
2. 缺少关联条件,会导致全表更新
你的 UPDATE 语句没有将 AspNetUserClaims 和子查询 f 做关联,执行后会把 AspNetUserClaims 表的所有行都更新,这绝对不是你想要的结果。
3. 关于 Id 列报错的原因
AspNetUserClaims 的 Id 列一般是主键(可能是自增列或GUID主键),主键列不允许随意更新:
- 如果是自增列,数据库会自动维护其值,手动更新会直接报错;
- 如果是GUID主键,虽然语法上允许,但修改主键会破坏数据完整性,完全没有必要。所以你注释掉
Id列是正确的,但这不是核心问题。
针对你的需求,分两种情况给出正确语句
情况一:更新该用户已存在的声明
如果你想修改用户 abc@gmail.com 现有的某个声明(比如把旧的声明类型改成 EmployeeNumber),可以用关联更新:
update auc set auc.ClaimType = 'EmployeeNumber', auc.ClaimValue = '1' from [test_MIM].[dbo].[AspNetUserClaims] auc inner join [test_MIM].[dbo].[AspNetUsers] au on auc.UserId = au.Id where au.UserName = 'abc@gmail.com' -- 可选:如果只想更新特定类型的声明,添加下面的条件 -- and auc.ClaimType = '旧的声明类型'
情况二:给该用户新增一条声明
你提到是“添加声明”,那应该用 INSERT 而不是 UPDATE,因为 UPDATE 是修改现有行,新增需要插入新记录:
insert into [test_MIM].[dbo].[AspNetUserClaims] (UserId, ClaimType, ClaimValue) select Id, 'EmployeeNumber', '1' from [test_MIM].[dbo].[AspNetUsers] where UserName = 'abc@gmail.com'
内容的提问来源于stack exchange,提问作者Rilcon42
相关产品推荐
相关产品推荐

