Asp.Net Identity Manager 2中的UserManager通过对数据库的附加请求来防止创建具有重复用户名的用户,以查找可能的重复。我认为这很容易出错,并可能导致并发错误。正确的机制应该依靠唯一的约束或索引。我错了吗?我错过了什么?Asp.Net Identity 2重复的用户名检查
链接到源: CreateAsync和ValidateUserName
Asp.Net Identity Manager 2中的UserManager通过对数据库的附加请求来防止创建具有重复用户名的用户,以查找可能的重复。我认为这很容易出错,并可能导致并发错误。正确的机制应该依靠唯一的约束或索引。我错了吗?我错过了什么?Asp.Net Identity 2重复的用户名检查
链接到源: CreateAsync和ValidateUserName
不,你没有错。和身份添加唯一索引上用户名柱:
而且该表的迁移代码是:
CreateTable(
"dbo.AspNetUsers",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
/* .... SNIP .... */
UserName = c.String(nullable: false, maxLength: 256),
})
.PrimaryKey(t => t.Id)
.Index(t => t.UserName, unique: true, name: "UserNameIndex");
唯一索引的列明确规定。
p.s.你正在看Identity v3 - 它没有发布。目前的身份V2.1还没有开源。
尽管Identity框架确实可以在基于EF的模型中实施唯一的约束,但请记住,Identity的设计是可扩展的并且可以与任何类型的存储一起使用..因此,无论它是否使用唯一约束,框架本身仍然必须做一些事情效率低下才能更具可扩展性。 – 2014-11-02 23:30:45
当然。目前'Identity.Core'不会在交易级别强制使用用户名的唯一性,但是这依赖于'IUserStore'实现来完成。当身份使用EF时,将实现唯一索引。我认为事务性检查对创建用户不是很重要。 – trailmax 2014-11-02 23:38:23
实体框架必须支持多个数据存储,而不是简单的基于数据库的存储。因此,它需要以适用于任何类型商店的方式验证唯一性。例如,你可能有一个基于XML的商店。你会如何执行独特的约束呢? – 2014-11-02 23:29:07
但是,查看链接到的代码..它使用自定义的“UserValidator”对象,如果Validator知道它正在使用能够使用唯一constratraints的数据存储,则它可以简单地返回true以进行任何重复检查码。 – 2014-11-02 23:33:44