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