2013-02-13 3 views
1

Я хочу попробовать и вставить в несколько таблиц в моей базе данных SQL Server, однако одна из моих первых вставок генерирует внешний ключ, который является значением IDENTITY, которое я хочу использовать в моем последующие вставки. Я не уверен, как это происходит с LINQ to SQL. Я думаю, что могу сделать это в нескольких транзакциях, но я предпочитаю делать это в одном месте ... иначе в разделе использования.Вставка нескольких LINQ to SQL с использованием IDENTITY из предыдущей вставки

Мой алгоритм псевдо-код выглядит следующим образом:

  1. Проверьте значение идентификатора существует в колонке 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 автоматически обрабатывает установку родительского идентификатора ребенка на основе ранее внесенного значения.

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 
    } 
} 

Как вы можете видеть, если ваш код выполняется перед Complete() выполняется, вы получите откат.

Список литературы

Смежные вопросы