1

SQL Serverデータベースの複数のテーブルに挿入しようとしていますが、最初の挿入の1つで、後続の挿入で使用するIDENTITY値の外部キーが生成されます。LINQtoSQLでこれをどのように処理するかわかりません。私は複数のトランザクションでそれを行うことができると思いますが、私はこれを1つの場所で行うことを好みます...別名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();
      }
    
4

2 に答える 2

3

LINQ to SQLは、行ごとに個別のステートメントではなく、オブジェクトグラフ上の作業単位パターンを中心に構築されました。親(Table1)と子(Table2)の間に関連付けがあるとすると、グラフを作成して1つの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();
  }
于 2013-02-13T21:52:33.417 に答える
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()が実行される前にコードが実行されると、ロールバックが発生します。

参考文献

于 2013-02-13T18:23:47.500 に答える