使用上一次插入中的IDENTITY插入多个LINQ到SQL
本文关键字:插入 LINQ SQL 上一次 IDENTITY | 更新日期: 2023-09-27 17:59:19
我想尝试插入SQL Server数据库中的多个表,但第一次插入时会生成一个外键,该外键是我想在后续插入中使用的IDENTITY值。我不确定如何在LINQ to SQL中实现这一点。我想我可以在多个交易中完成,但我更喜欢在一个地方完成。。。也就是在using子句中。
我的伪码算法如下:
- 检查TABLE1.COL2列中是否存在ID值
- 如果不存在,则将新行插入TABLE1
- 从TABLE1.COL1列中获取新插入行的外键值
-
使用新的外键值创建一个对象,并更新TABLE2。
using (var sms = new SmsDataDataContext(connection_string) { foreach(SomeObject i in ListofObject) { TABLE1 t1 = CheckID(sms, i.ID); if (t1== null) { TABLE1 new_row = new TABLE1(); sms.TABLE1.InsertOnSubmit(new_row); //Ideally I want to do something like this even though i dont think it will work. sms.SubmitChanges(); TABLE2 update_row = new TABLE2(); update_row.ID = new_row.COL1.value; //has the newly created identity value from my last insert. //Assume this update_row exist in my TABLE2 table. sms.TABLE2.InsertOnSubmit(update_row); } } sms.SubmitChanges(); }
LINQ to SQL是围绕对象图上的工作单元模式构建的,而不是针对每行单独的语句。假设您的父级(表1)和子级(表2)之间有关联,那么您应该能够构建图形并发出单个SubmitChanges。LINQ to SQL将根据之前提交的值自动处理设置子级的父ID。
using (var sms = new SmsDataDataContext(connection_string)
{
foreach(SomeObject i in ListofObject)
{
TABLE1 t1 = CheckID(sms, i.ID);
if (t1== null)
{
TABLE1 new_row = new TABLE1();
sms.TABLE1.InsertOnSubmit(new_row);
TABLE2 update_row = new TABLE2();
new_row.Table2s.Add(update_row);
}
}
sms.SubmitChanges();
}
您可以使用TransactionScope
。
只需像这样将您的整个数据库调整块包装在其中:
using (var MyTran = new TransactionScope())
{
try{
//Insert #1
//Insert #2
...
MyTran.Complete();
}catch{
// if the flow of control comes here, transaction will not be committed
}
}
正如您所看到的,如果您的代码在Complete()执行之前执行,则会得到回滚。
参考
- 交易范围
- 完整代码示例(堆栈溢出)