2014-02-28 76 views
1

我从控制器产生的用户ID以这种方式违反PRIMARY KEY约束无法插入Dublicate主键

long lastUserId = 0; 

var userProfile = from m in db.UserProfiles select m; 
userProfile = userProfile.Where(s => s.DbType == "OFFLINE"); 

foreach (var c in userProfile) 
{ 
    lastUserId = c.UserId; 
} 

if (lastUserId != 0) 
{ 
    lastUserId = lastUserId + 1; 
} 
else 
{ 
    lastUserId = 1000001; 
} 

当在同一时间任何两个人登记,打我得到键冲突的错误控制器现在该怎么办?

+0

您可以使用GUID来代替长lastUserId –

+2

如果可以的话,让数据库处理这个问题。使用SQL Server中的IDENTITY列或Oracle中的SEQUENCE来为每个请求提供唯一值 –

回答

0

使用GUID为ID,如果生成的代码标识

用你的数据库...如果你必须使用长型,则标识符字段应该是一个自动递增的主键,这在创建插入唯一数值(用于SQL Server BIGINT类型值。)

1

使用GUID为ID或通过在数据库采取BigInt有使ID字段自动递增,让数据库来处理这个问题。

Guid lastUserId; 
var userProfile = from m in db.UserProfiles select m; 
userProfile = userProfile.Where(s => s.DbType == "OFFLINE"); 

foreach (var c in userProfile) 
{ 
    lastUserId = c.UserId; 
} 

if (your condition) 
{ 
    lastUserId = new Guid(); 
} 
+0

我无法使用BigInt,因为我想要根据我的需要构建唯一ID –

+0

然后将db列更改为唯一标识符(Sql Server)并使用Guid。 –

+0

还有另外一种方法,但那会很长...... –

1

我会建议使用该列上的主键有IDENTITY,所以你不需要检查。

if (lastUserId != 0) 
{ 
    lastUserId = lastUserId + 1; 
} 
else 
{ 
    lastUserId = 1000001; 
} 

它会自动增加最后一个值。

你也可以定义IDENTITY应该从XYZ数开始,然后按照你的意愿增加1。

每个数据库都支持IDENTITY功能。

+0

我无法使用BigInt,因为我想要根据我的需要建立唯一身份证 –

+0

是的,你可以使用bigint db – Amit

0

使用

static long lastUserId = 0; 
相关问题