2013-02-13 43 views
1

我想嘗試插入到我的SQL Server數據庫中的多個表中,但是我的第一個插入生成的外鍵是IDENTITY值,我想在我的後續插入。我不知道我在LINQ to SQL中如何處理這個問題。我認爲我可以在多次交易中做到這一點,但我更喜歡在一個地方做這個......也就是在使用條款中。從前面的插入使用IDENTITY的多個LINQ to SQL插入

我的僞代碼算法如下:

  1. 檢查ID值TABLE1.COL2列中存在
  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(); 
        } 
    

回答

3

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

正如你所看到的,如果你的代碼之前完全執行()被執行,你會得到一個回滾。

參考