ASP.NET身份版本1.0
如果我们尝试添加ID已存在于数据库中的用户,UserManager.CreateAsync(user,password)方法调用的默认行为是什么?
我问的是前段时间以下的代码行
IdentityResult result = await UserManager.CreateAsync(user, password);
返回一个非空的错误列表的IdentityResult对象,表示“具有ID [ID]的用户已经存在” .
但是现在(我们没有做太多更改)我们在尝试在数据库中插入新用户记录时遇到异常 . 在这两种情况下,UserManager.CreateAsync在我们的IUserStore实现中调用FindByNameAsync,该方法查找并返回正确的User对象 .
如何查看UserManager.CreateAsync方法的内部实现?在调用IUserStore的CreateAsync之前,它是否检查新的User对象是否存在?我想它确实(因为它调用FindByNameAsync但似乎它不认为发现User对象是“现有的” .
1 回答
我找到了使用DotPeek的答案(感谢trailmax的建议) . 是的,UserManager.CreateAsync进行验证(通过UserValidator类),验证器(以及其他条件)具有以下代码:
因此,正如我们所看到的那样,检查具有此UserName的用户是否已经存在但是仅当该用户的Id与我们尝试创建的用户对象的Id不同时才会引发错误 .
由于我们在插入之前生成了Id,它实际上等于用户的电子邮件 - 这导致了问题 . 解决方案很简单:最好在将用户ID插入数据库之前生成用户ID .