Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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
C# 使用上一次插入中的标识进行多个LINQ到SQL插入_C#_Sql Server_Linq - Fatal编程技术网

C# 使用上一次插入中的标识进行多个LINQ到SQL插入

C# 使用上一次插入中的标识进行多个LINQ到SQL插入,c#,sql-server,linq,C#,Sql Server,Linq,我想尝试插入到SQL Server数据库中的多个表中,但我的第一次插入会生成一个外键,该外键是我希望在后续插入中使用的标识值。我不确定如何在LINQtoSQL中实现这一点。我想我可以在多个交易中完成,但我更喜欢在一个地方完成。。。aka在using子句中 我的伪代码算法如下: 检查TABLE1.COL2列中是否存在ID值 如果不存在,则在表1中插入新行 从TABLE1.COL1列中获取新插入行的外键值 使用新外键值创建对象并更新表2 using (var sms = new SmsDataDa

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

我的伪代码算法如下:

  • 检查TABLE1.COL2列中是否存在ID值
  • 如果不存在,则在表1中插入新行
  • 从TABLE1.COL1列中获取新插入行的外键值
  • 使用新外键值创建对象并更新表2

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

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

    参考资料


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