2009-10-09 283 views
1

這是我第一個MVC/Linq to SQL應用程序。我使用開箱即用的ASP.NET成員來跟蹤用戶通過我的系統。我該怎麼辦?

大家都知道,UserId是一個guid,很棒。但是,爲了鏈接系統中的其他用戶創建的表,我決定使用用戶名而不是用戶名。我這樣做的原因是因爲:

  1. 用戶名是唯一反正
  2. 它阻止我不必處理DB函數時作出額外的呼叫。

例如:我不必查看基於用戶名的用戶名來創建新的故事;我只需將User.Identity.Name插入到故事表中。

現在我遇到了一些令人討厭的併發症,這似乎與此有關。它在我的本地機器上正常工作,但不在主機上。我不斷地得到了一句這樣的錯誤:

「System.InvalidCastException:指定的轉換是無效的System.Data.Linq.IdentityManager.StandardIdentityManager.SingleKeyManager」 ......

這件事發生的時候插入主機上發生的數據庫。如果我理解正確,這是當您將非整數字段(以我的用戶名)連接到非整數字段(aspnet_user中的用戶名)的另一個表時發生的錯誤。雖然報告的錯誤似乎有點不同,也許它們是相似的?

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=351358

在任何情況下,MS錯誤或不 - 是存儲的用戶名,而不是用戶ID在我的表壞主意?如果是這樣,爲什麼?

更新

我只是想在這裏補充一些更多的上下文。人們提出的一個很好的觀點是,如果我想允許用戶在將來更改他們的用戶名,這是很危險的。完全有效!

但是,這個應用程序在很大程度上依賴於用戶名。每個用戶創建一個且僅有一個故事。然後他們通過使用mysite/username鏈接到他們的故事。因此,應用程序絕不允許他們更改他們的用戶名。對於那些僅僅關注鏈接的人來說,它會導致潛在的噩夢,從而看到它不再存在。

回答

1

請注意您對用戶名的評論是獨一無二的。 Anita Takeabath一分鐘與Seymour Butts結婚,突然想起來,他們想成爲鄰居。

只是一個念頭!

+0

是的,非常好 - 根據@Jakub所說的話(但稍微有趣一些)。 – Mike 2009-10-09 18:31:57

1

我已經使用了和你一樣的方法,它工作。你的應用程序表和會員數據庫中的表有關係嗎?如果是這樣,你可能想要刪除這種關係。

+0

很高興知道我不是唯一一個。今天沒有鏈接。 – Mike 2009-10-09 18:22:19

+0

只是爲了澄清 - 由於該錯誤,我不再與我創建的表和aspnet_user表有關係。讓我有點不安,但我不認爲這應該是一個問題。 – Mike 2009-10-09 18:23:46

1

我唯一的想法是爲了將來能夠證明你的應用程序,userid會爲用戶更改用戶名提供靈活性,因爲userid會保持不變(比如SO)。但這是符合您的應用需求的。然後再次需求往往傾向於改變,而不是開發人員的控制。

+0

你剛剛做出的優秀點!對於我的應用程序,用戶名永遠不會改變謝謝。 – Mike 2009-10-09 18:30:39

0

它的壞的原因如下:

  1. 你提到了避免額外的數據庫調用。但是,通過連接表,不需要對數據庫進行「額外」調用。你可以爭辯說,加盟比沒有加盟貴。但是,商店最有可能需要比用戶登錄名更多的用戶信息(請注意:用戶名不唯一,用戶登錄名稱是唯一的)。所以你需要加入大多數數據庫操作。

  2. 用戶登錄名稱具有不同的長度,它在加入時使用效果不佳。

編輯:修改後的格式。我仍然在學習如何讓我的帖子看起來更好:-)

+0

我在說用戶登錄名,所以它們將是唯一的。現在就要加入 - 這對選擇來說是真的,但是插入怎麼辦?因此,我創建了一個新故事,新評論等等。我不必首先從用戶名獲得用戶名,然後插入?這就是我想要避免的。 – Mike 2009-10-09 18:36:58

+0

我通常不喜歡問這個問題,但我現在必須問:你爲什麼試圖避免它?在大多數情況下,插入將顯着少於選擇。所以在這裏表演不應該成爲一個問題。如果不是表現,你還想要避免什麼?我覺得你正在以一個嚴重的價格交易一些微不足道的東西。 – Codism 2009-10-09 19:08:24

+0

我想我只是採取稍微簡單一點,防彈的方式,因爲應用程序的用戶名是100%唯一的。我現在無法想到它的任何缺點...... – Mike 2009-10-09 19:11:28

0

如果你實現這個的原因是爲了更容易訪問用戶的GUID,我建議讓你的FormsAuthentication.SetAuthCookie使用用戶的GUID作爲名稱屬性並在整個應用程序中使用User.Identity.Name。

使用用戶名作爲唯一標識符可能會在未來造成不好的後果。如果您希望將來允許用戶更改他們的用戶名,那麼您將很難實現這一點。