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

时间:2013-02-13 16:23:25

标签: c# sql-server linq

我想尝试插入我的SQL Server数据库中的多个表,但是我的第一个插入之一会生成一个IDENTITY值的外键,我希望在后续插入中使用它。我不确定如何在LINQ to SQL中使用它。我想我可以在多个交易中做到这一点,但我更喜欢在一个地方做这个......也就是在使用条款中。

我的伪代码算法如下:

  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();
      }
    

2 个答案:

答案 0 :(得分:3)

LINQ to SQL是围绕对象图上的工作模式而不是每行的单独语句构建的。假设您的父(Table1)和子(Table2)之间存在关联,您应该能够构建图形并发出一个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();
  }

答案 1 :(得分:0)

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

<强>参考