2017-07-31 67 views
-1

我在我的數據庫中有一個註冊表,其中的字段RegistrationNumber需要唯一。保證數據庫中的唯一值

我想知道什麼是最好的方法來保證我會在每種情況下提供唯一的編號。

我要做的就是在我的Repository我保存新的註冊,是這樣的:

void IMyRepository.Repository(Registration registration) 
{ 
    registration.RegistrationNumber = _getNewRegistrationNumber(); 

    dbContext.SaveChanges(); 
} 

private string _getNewRegistrationNumber() 
{ 
    // what to do? get last registration number and increment? it could be 
    // either integers or integers mixed with letters. 
} 

我擔心什麼是如果兩個人在同一時間完成註冊表格,我怕在第一個到達dbContext.SaveChanges();之前,第二個將進入_getNewRegistrationNumber()函數,並且可能獲得相同的RegistrationNumber

有沒有建議嗎?

[編輯] :GUID過長

+1

創建一個GUID可能是最好還是讓DB分配一個自動遞增值。 – ChiefTwoPencils

+1

https://www.bing.com/search?q =數據庫中的保證+獨特+值+ ......有人試圖實現這樣的事情的可能性很小......甚至可能創建了諸如獨特密鑰之類的數據庫功能或自動增量字段... –

+0

@ChiefTwoPencils我喜歡這個主意,但我希望它是一個字符串值,因爲所有的registrationNumbers都應該具有相同的長度。 – joks

回答

3

你有3種選擇:

  1. 使用計算Identiy柱(自動遞增),其將會被自動創建,如果你插入一個新的記錄。缺點是,你需要一個到數據庫的圓圈,然後你有一個數字
  2. 使用Guid
  3. 在數據庫中使用unqiue索引並計算自己的數字。如果該號碼在保存時已經存在,則可以捕獲異常。
+0

我喜歡第一個選項,但是因爲我希望它是一個字符串值,所有長度都相同,我不認爲這會起作用。我應該提到GUID太長了。如果我沒有更好的想法,我想我會選擇第三種方式,但我想過,但是想知道我是否有更好的選擇 – joks

+0

爲什麼它需要是@joks字符串?如果你喜歡第一個,就把它當作int,然後在你的應用程序中使用'registration.RegistrationNumber.ToString()' –

+0

在數據庫中,我希望字段能夠有前面的零(可能應該已經聲明在問題:()中,因爲它們都應該具有相同的長度,所以如果它是int,那麼首先我們有1,並且很快我們將有10個,而不是相同的長度,所以我想要有00000001和00000010等等。 – joks

0

到guarant獨特價值的最好方法是GUID

void IMyRepository.Repository(Registration registration) 
{ 
    registration.RegistrationNumber = Guid.NewGuid().ToString(); 

    dbContext.SaveChanges(); 
}