2011-10-26 77 views
3

我正在創建一個方法在我的數據訪問類,它將插入一個實體對象到數據庫,我期待得到最新插入的ID事後...我已經這樣做了,但後來我想知道如果方法在某種程度上被同時調用兩次,會發生什麼,它會返回錯誤的ID嗎?C#/ Linq-to-sql - Lock datacontext.Table on insertonsubmit

所以作爲工作周圍,我決定鎖定在我的DataContext表:

lock(dataContext.Persons) 
{ 
    InsertOnSubmit(person); 
    dataContext.SubmitChanges(); 
} 

但我不覺得這是不恰當的。我的意思是,表心不是很大,它不會採取對數據上下文提交更改......所以我的問題是,通過鎖定它會遇到什麼樣的麻煩? PS:讓我知道如果我的問題不夠清楚,我會編輯它!

回答

1

有沒有必要鎖定你的表。

當您插入person時,在您撥打.SubmitChanges()時,LINQ-to-SQL將自動使用數據庫中的身份填充您的ID字段。

需要注意的是,您的數據庫和L2S實體都必須將您的ID字段定義爲標識。在您的Person實體上,您應該將該字段定義爲主鍵IsDbGenerated=trueUpdateCheck=never,並且具有正確的數據庫類型。

一旦提交,你應該能夠簡單地從你的Person實體檢索ID

dataContext.Persons.InsertOnSubmit(person); 
dataContext.SubmitChanges(); 
var id = person.ID; // now has the database generated identity. 
+0

好的,謝謝..但你知道如果我有這個鎖,可能會出錯嗎? – BSarkis

+0

@BSarkis:不知道你的意思是_go wrong_。你並沒有阻止任何人在這個鎖之外觸及那個表,你只保護這個代碼塊不受併發的影響。 – Marc

+0

我明白了,那是我正在尋找的那種答案,再次感謝你。 – BSarkis

1

林不知道這是不是您的問題的一部分,但如果你使用的TransactionScope你可以在一傳TransactionOption將處理多個事務。

結賬TransactionOption.Isolationlevel

+0

不確定是否會在這種情況下有所幫助,但我很感謝您的嘗試,我會檢查一下。 – BSarkis