Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 插入数据库之前对象的Id(Linq到SQL)_Sql Server_Linq To Sql_Identity - Fatal编程技术网

Sql server 插入数据库之前对象的Id(Linq到SQL)

Sql server 插入数据库之前对象的Id(Linq到SQL),sql-server,linq-to-sql,identity,Sql Server,Linq To Sql,Identity,据我所知,在调用SubmitChanges()方法之前,linqtosql实际上不会执行任何数据库命令(包括打开数据库连接)。如果是这样,我想增加一些方法的效率。我是否可以在插入对象之前检索对象的ID?我不想调用SubmitChanges()两次,如果我能够在ID实际插入数据库之前知道它的值的话。从逻辑的角度来看,只有打开到数据库的连接才能找到值,但是插入过程也必须发生吗 谢谢好吧,问题是:在插入数据库之前,您以某种方式获得了id,并对其进行了一些处理。在同一时间,另一个线程执行相同的操作,并且

据我所知,在调用
SubmitChanges()
方法之前,linqtosql实际上不会执行任何数据库命令(包括打开数据库连接)。如果是这样,我想增加一些方法的效率。我是否可以在插入对象之前检索对象的
ID
?我不想调用
SubmitChanges()
两次,如果我能够在ID实际插入数据库之前知道它的值的话。从逻辑的角度来看,只有打开到数据库的连接才能找到值,但是插入过程也必须发生吗


谢谢

好吧,问题是:在插入数据库之前,您以某种方式获得了id,并对其进行了一些处理。在同一时间,另一个线程执行相同的操作,并且获得相同的ID,则会发生冲突


也就是说,我认为没有一种简单的方法可以做到这一点。

解决这一问题的常用方法是在应用程序层生成一个唯一标识符(如GUID),并将其用作
ID
。这样,您就不必在后续调用中检索ID


当然,使用GUID作为主键可能有其缺点。如果您决定这样做,请查找COMB GUID。

我不一定推荐这样做,但我已经看过了。您可以使用存储过程和表将自己的ID计算为整数,以保存下一个ID的值。存储过程从表中选择值以返回该值,然后递增该值。该表将如下所示

Create Table Keys(
name varchar(128) not null primary key,
nextID int not null
)

在执行此操作之前需要注意的是,如果选择并在两个不同批次中更新,则可能会发生密钥冲突。这两个步骤都需要作为一个原子事务处理。

我感觉情况就是这样。有没有一种方法可以打开数据库连接并保留ID(就好像它已经被占用了一样),但实际上不执行插入?任何其他线程都会将其视为已获取,并返回下一个免费ID。感谢您对COMB GUID的提醒。我没有遇到过这些,所以我会通读一遍。