insertonsubmit上的C#/Linq to sql-锁定datacontext.Table

insertonsubmit上的C#/Linq to sql-锁定datacontext.Table,c#,linq-to-sql,C#,Linq To Sql,我目前正在我的数据访问类上创建一个方法,该方法将向数据库中插入一个实体对象,我希望以后能得到最新插入的ID。。。我已经这样做了,但是我想知道如果这个方法同时被调用了两次,会发生什么,它会返回错误的ID吗 因此,为了解决这个问题,我决定将表锁定在我的datacontext上: lock(dataContext.Persons) { InsertOnSubmit(person); dataContext.SubmitChanges(); } 但我确实觉得这不合适。。。我的意思是,这

我目前正在我的数据访问类上创建一个方法,该方法将向数据库中插入一个实体对象,我希望以后能得到最新插入的ID。。。我已经这样做了,但是我想知道如果这个方法同时被调用了两次,会发生什么,它会返回错误的ID吗

因此,为了解决这个问题,我决定将表锁定在我的datacontext上:

lock(dataContext.Persons)
{
    InsertOnSubmit(person);
    dataContext.SubmitChanges();
}
但我确实觉得这不合适。。。我的意思是,这个表并不大,而且提交更改不会花费很长时间到datacontext。。。所以我的问题是,这样锁定它会遇到什么样的麻烦


PS:如果我的问题不够清楚,请告诉我,我会编辑它

无需锁定您的桌子

当您插入
人员时,当您调用
.SubmitChanges()
时,LINQ to SQL将自动使用数据库中的标识填充
ID
字段

需要注意的是,数据库和L2S实体都必须将
ID
字段定义为标识。在
个人
实体上,应该将该字段定义为主键,
IsDbGenerated=true
UpdateCheck=never
,并具有正确的数据库类型

提交后,您应该能够简单地从您的
个人
实体检索
ID

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

我不确定这是否是您关注的一部分,但如果您使用TransactionScope,您可以传入一个TransactionOption,该选项将处理多个事务


退房

好的,谢谢。。但是你知道如果我有这把锁会出什么问题吗?@BSarkis:不知道你说的出什么问题。您并没有阻止任何人接触此锁之外的表,您只是在保护这一块代码不受并发影响。我明白了,这就是我一直在寻找的答案,再次感谢您。@Marc您有任何链接支持您的答案吗?不确定这在这种情况下是否有帮助,但我感谢您的尝试,我去看看。