2017-07-31 40 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(); 
}