2014-02-28 98 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; 
相關問題