2014-07-24 85 views
2

我將爲我們的退出和新應用程序創建一個新的授權DLL。 我們希望爲POCO類,OAuth和聲明添加Identity 2.0主要功能。 (索賠真的很重要)標識2.0字符串或Int主鍵?

因此,首先想到的是主鍵是一個字符串。我知道這可以改變,但我也第一次研究爲什麼它是一個字符串,我發現這個答案: Why do the ASP.NET Identity interfaces use strings for primary and foreign keys?他們cleary指定該字符串'更好',以避免鑄造,因爲索賠確實使用字符串。

我們所有的當前應用程序都使用Int作爲主鍵(自動增量)。

而不是盲目的和改變身份實現使用int我研究了更多,同一個答案建議一個解決方案是有一個字符串表示的ID。

喜歡的東西:

[Index(IsClustered = false)] 
string Id 
[Index(IsClustered = true)] 
int LogicalId 

我不知道什麼是聚簇索引,但閱讀它在某種程度上行是如何排列的物理磁盤,所以它是關於性能的,所以我會去用它作爲正常。

我的問題是:

主要:什麼是這種情況的最佳做法/建議嗎?

  • a)具有LogicalId INT,
  • B)覆蓋認同與詮釋
  • c中的默認實現),所有的INT轉換爲字符串(如GUID)

的情況下, LogicalId(a):

如果我們無法將PK用作字符串,那麼這樣做的目的是什麼?如何在SaveChanges數據庫上的新實體時增加LogicalId? EF會自動爲我做到這一點?

與TKEY的作爲INT倍率身份實現的情況下:(b)中

使用者ID上權利要求是:(i猜)總是字符串。如果我們爲我們的用戶使用多個外部提供商,那會很重要嗎 是否可以創建EntityFramework for Int的具體實現?任何人都已經?

Uninstall-Package Indentity.EntityFramework 
Install-Package Identity.EntityFrameworkInt 

那將是很好:d

所有數據轉換爲字符串(C)

是不是疼痛GUID來工作嗎?那些使用GUID的人你還有另一個更簡單的標識符供公衆使用嗎? 無法停止映像客戶服務:

我無法在我們的記錄中找到您的用戶,您能否提供您的用戶ID?

哎喲

網站無法正常工作,當我點擊50 {同類產品}

之一 - 什麼是產品編號?

我們有兩個產品等,請刪除一個。

- 當然,給我的產品ID

CUAC

回答

1

我不看鏈接的問題,因爲這意味着他們是更好的。 string不是更好,它只是不同而已。我讀它的原因是,字符串可以保存整數,指導和任何東西。如果他們選擇使用int,那麼他們被卡在int

正如您所觀察到的,Identity 2.0中添加了TKey以允許使用不同類型的密鑰,並且選擇不同類型的密鑰不會「違背最佳實踐」(儘管您應該選擇傳統方式)。

每當你打算保存一個新的實體時,你都不會將它設置爲一個自動遞增的身份,只是使用代碼來生成一個新的GUID。那裏沒有任何痛苦。

除非您正在開發一些服務於大量用戶的功能,否則您不應該遇到性能問題,所有這些都會觸發您的數據庫。

就我個人而言,我選擇ints,因爲我有一箇中央數據庫處理所有事情,我喜歡簡單的ints over guids。儘管如果我正在開發某種帶有併發數據庫的系統,我會選擇Guids。

字符串仍然通過任何其他密鑰類型提供身份的一件事是,User.Identity.GetUserId()的擴展名仍然會返回一個字符串,因此即使在覆蓋TKey之後,您也必須進行強制轉換。希望這會在某個時候被修復。

相關閱讀:GUID vs INT

+0

+1固定User.Identity.GetUserId() –

+0

我知道這是一個老問題,但會下降的問題,但對於這種情況。當數據庫通過身份,自動增量列創建你的Id時,你有沒有解決過這個問題?在註冊我的用戶得到保存到數據庫,但在IdentityUser實例Id保持0(默認值爲int),因爲usermanager不讀取數據庫新創建的ID。任何幫助將不勝感激。謝謝! –

+0

@deezg我還沒有聽說過這個問題。你可能有更好的運氣開個問題 – Shoe