2010-11-16 58 views
2

我有一個用戶表,其中沒有兩個相同的用戶可以存在,什麼是最好的方式來做這個錯誤免費?asp.net mvc避免重複

我所做的是我在控制器中寫了一個重複檢查,但有人對我說這是不對的。他說把獨特的數據庫表?我也在其他幾個控制器上實現了這一點。我應該改變它嗎?

+0

我忘記提及我正在使用LINQ到sql – maztt 2010-11-16 11:57:52

回答

3

有幾個地方你應該這樣做。

  • 在數據庫表級別:使用電子郵件作爲用戶名和標記爲唯一constrant
  • 在模型驗證水平,你可以檢查電子郵件,並在客戶端返回驗證錯誤
  • ,你可以放置一些代碼使用異步請求時,用戶在文本框中輸入用戶名

,將檢查用於實時重複的電子郵件或用戶名 - 編輯 -

,建議在把所有三個更好的驗證。不一致的數據對於您的系統來說是最糟糕的事情。因爲我認爲是的,正確的數據=質量好

- 編輯完 -

請記住,驗證代碼應放在模型,並學習如何編寫管理的面向對象的代碼,你可以看到例如的mvc store front

希望這將有助於

+1

客戶端方法很好,但很容易導致從您那裏獲取用戶或他們的電子郵件數據庫,所以我不會推薦它。 – Migol 2010-11-16 11:53:02

+0

@Molol,同意你的意見。有很多方法可以預防它,但是你是對的,你應該牢記這一點 – 2010-11-16 11:58:15

+0

如果你希望在整個代碼中冒出錯誤信息,那麼Db約束對於完成這種類型的工作是非常糟糕的。所有東西都依賴於某種類型的「錯誤信息」服務。 – jfar 2010-11-16 13:17:07

5

最好就是在數據庫級別,執行你的數據限制在可能的情況。考慮以下情況:

2請求在同一時間創建具有相同名稱的用戶。

  1. 請求1檢查數據庫,看看是否存在 - 用戶不;
  2. 不久之後,請求2檢查數據庫以查看是否存在 - 用戶沒有;
  3. 請求1創建此用戶。
  4. 請求2創建一個重複的用戶。
  5. Bang。一切都停止按照你期望的方式工作。

至於是否使用唯一約束,或者有這個作爲主鍵,則是另一個問題,並在很大程度上取決於你的情況(因爲你有某種在這個表上,不要主鍵你是什​​麼意思?)

+0

使用事務是一個很好的做法... – Migol 2010-11-16 11:53:41

+1

@Migol,我會同意,但數據庫仍然是這個約束的地方,不管前端是否使用事務。 – Paddy 2010-11-16 12:20:36

+0

Erm,upvote但有一個問題,你想要使用一個唯一的約束 - 因爲你真的不想使用一個「真正的」值作爲主鍵。 – Murph 2010-11-16 12:36:19