![](/img/trans.png)
[英]How to insert primary key from one table which created by auto increment, into a second table as forign key?
[英]How to get the primary key from a table without making a second trip?
如何在不进行LINQ To SQL数据库的第二次访问的情况下从表中获取主键ID号?
现在,我将数据提交到一个表中,并再次进行一次旅行,以确定为新字段分配的id(在自动增量id字段中)。 我想在LINQ To SQL中执行此操作,而不是在Raw SQL中执行此操作(我不再使用Raw SQL)。
此外,我的问题的第二部分是:我总是小心地知道在线用户的ID,因为我宁愿使用他们的ID在各种表中调用他们的信息,而不是使用GUID或用户名,这些都是长的字符串。 我之所以这样做是因为我认为进行数字比较的SQL Server比使用用户名(字符串)甚至是guid(非常长的字符串)比较更有效(?)。 我的问题是,我是否比我应该更关心? 差异值是否总是将userid(int32)保持在会话状态?
@RedFilter为第一个问题提供了一些有趣/有希望的线索,因为我在这个阶段无法尝试它们,如果有人知道或可以确认他在答案的评论部分建议的这些变化?
如果您有对该对象的引用,则可以在调用db.SubmitChanges()
之后使用该引用并调用主键。 LINQ对象将自动更新其(标识符)主键字段,以反映通过SQL Server分配给它的新主键字段。
示例(vb.net):
Dim db As New NorthwindDataContext
Dim prod As New Product
prod.ProductName = "cheese!"
db.Products.InsertOnSubmit(prod)
db.SubmitChanges()
MessageBox.Show(prod.ProductID)
您可以在函数中包含上面的代码并返回ProductID(或等效的主键)并在其他地方使用它。
编辑:如果您没有进行原子更新,您可以将每个新产品添加到单独的集合中,并在调用SubmitChanges后迭代它。 我希望LINQ像数据集一样提供“数据库偷看”。
除非您正在做一些与众不同的事情,否则您不需要做任何额外的事情来检索生成的主键。
在Linq-to-SQL datacontext上调用SubmitChanges
时,它会自动更新对象的主键值。
关于你的第二个问题 - 通过对数字字段进行扫描而不是像varchar()那样,可能会有很小的性能提升,但是通过确保数据库中的正确列被索引,您将看到更好的性能。 并且,对于SQL Server,如果使用标识列创建主键,则默认情况下它将具有聚簇索引。
Linq to SQL使用插入新记录时生成的ID自动设置类的标识值。 只需进入酒店。 我不知道它是否使用了单独的查询,从未使用它,但ORM需要另一个查询来取回最后插入的ID并不罕见。
有两种方法可以独立于Linq To SQL(可以使用它):
1)如果您使用的是SQL Server 2005或更高版本,则可以使用OUTPUT子句:
返回受INSERT,UPDATE或DELETE语句影响的每一行的信息或基于表达式的表达式。 这些结果可以返回到处理应用程序,以用于确认消息,存档和其他此类应用程序要求。 或者,可以将结果插入表或表变量中。
2)或者,您可以构造一个这样的批处理INSERT语句:
insert into MyTable
(field1)
values
('xxx');
select scope_identity();
它至少可以用于SQL Server 2000。
在T-SQL中,您可以使用OUTPUT子句,说:
INSERT table (columns...)
OUTPUT inserted.ID
SELECT columns...
因此,如果您可以将LINQ配置为使用该构造进行插入,那么您可以轻松地将其恢复。 但是,LINQ是否可以从插入中获取值,我会让其他人回答这个问题。
从LINQ调用存储过程返回ID作为输出参数可能是最简单的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.