使用上一次插入中的IDENTITY插入多个LINQ到SQL

本文关键字:插入 LINQ SQL 上一次 IDENTITY | 更新日期: 2023-09-27 17:59:19

我想尝试插入SQL Server数据库中的多个表,但第一次插入时会生成一个外键,该外键是我想在后续插入中使用的IDENTITY值。我不确定如何在LINQ to SQL中实现这一点。我想我可以在多个交易中完成,但我更喜欢在一个地方完成。。。也就是在using子句中。

我的伪码算法如下:

  1. 检查TABLE1.COL2列中是否存在ID值
  2. 如果不存在,则将新行插入TABLE1
  3. 从TABLE1.COL1列中获取新插入行的外键值
  4. 使用新的外键值创建一个对象,并更新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();
      }
    

使用上一次插入中的IDENTITY插入多个LINQ到SQL

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()执行之前执行,则会得到回滚。

参考

  • 交易范围
  • 完整代码示例(堆栈溢出)