2012-04-12 19 views
1

我有一個表(SQL Server)的,如:增量記錄位置的數據庫(LINQ通過或TSQL)

UserId CompanyId UserName Position 
    1   1 John  1 
    2   2 Adam  1 
    3   2 Nick  2 
    4   1 Mark  2 
    5   3 Jack  1 

userid是自動增量的PK。 CompanyID是FK。職位只是用戶(每家公司)的連續計數器。

當爲公司插入新的用戶記錄(通過LINQ)時,我希望位置也增加。目前,我獲得給定CompanyId的頭寸的MAX + 1,然後將其分配給新記錄。問題是併發插入操作通常會導致相同的位置值。

我試着增加插入觸發器中唯一性的位置,但是LINQ並沒有自動反映更新的值。

我該如何解決這個問題,通過LINQ到SQL或直接作爲TSQL查詢?

任何幫助表示讚賞。謝謝!

+0

你有沒有試過在設置位置時使用數據庫事務獲得獨佔鎖? – 2012-04-12 07:13:59

+0

@ShoaibShaikh我試圖避免鎖定表,但我會看看它在交易中包裝。 – Nick 2012-04-12 07:20:13

+0

如果將[IsDbGenerated設置爲true](http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.columnattribute.isdbgenerated%28v=vs.90),則可以返回以觸發解決方案%29.aspx)和[AutoSync to OnInsert](http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.columnattribute.autosync%28v=vs.90%29.aspx) – 2012-04-12 08:39:57

回答

0

我可以告訴你關於TSQL查詢。 你可以使用 IDENT_CURRENT - 它給你的最後一個ID插入表由任何人。 如果這是不是你想要的不是試圖什麼 - SCOPE_IDENTITY

0

我的2美分:

begin transaction 
    declare @v int 
    select @v = isnull((select max(field2)+1 from t1), 1) 
    insert into t1 (field2) values (@v) 
commit transaction 

-- just checking 
select * from t1 
0

您可以在unique constraintCompanyIDPosition添加,以防止重複。

create table Users 
(
    UserId int identity primary key, 
    CompanyId int not null, 
    UserName char(10) not null, 
    Position int not null, 
    unique(CompanyId, Position) 
) 

而不是重複你得到一個異常,並在你的代碼中,你可以做一些事情,可能是重試。