Связанная вставка не работает в transationscope

Я использую TransactionScope для добавления данных объекта в одну базу данных.

псевдокод:

using (TransactionScope trx = new TransactionScope())
{
   SqlConnection con = DL.GetNewConn();
   int newParentRecordID = InsertParentIntoTableA(object parent, con);

   foreach(obj child in parent.childrenObjects)
   {
       child.ParentID = newParentRecordID ;
       int newChildRecordID =  InsertChildIntoTableB(object child, con);
   }
   trx.Complete();
}

Я получаю исключение в InsertChildIntoTableB () с ошибкой, заключающейся в том, что ParentID в TableB не имеет соответствующей записи первичного ключа в TableA.

Соединение используется повторно.

Как мне обойти это? Выполнение SELECT WITH (NOLOCK) в TableA действительно показывает недавно вставленную родительскую запись, но следующая вставка дочерней записи не может ее увидеть.

Отредактируйте, чтобы уточнить: в цикле foreach у меня уже есть вставленный, но незадействованный новый ParentID. Проблема заключается в том, что вставка в дочернюю таблицу TableB не выполняется, поскольку FK в таблице TableB для родительской таблицы TableA не может видеть незакрепленный новый идентификатор PK TableA.


person callisto    schedule 15.09.2009    source источник


Ответы (2)


Примечание: вы должны явно завершить транзакцию с помощью метода экземпляра TransactionScope.Complete, иначе она будет отменена.

person Dzmitry Huba    schedule 15.09.2009
comment
Я оставил это в псевдокоде. Исправлено для вашего удовольствия от просмотра. - person callisto; 15.09.2009
comment
Это не дает ожидаемого решения. Это не должен быть принятый ответ. - person LittleBit; 10.08.2015

Если у вас есть столбец идентификаторов, вы можете попробовать использовать ВЫВОД ВСТАВЛЕН в вашем операторе INSERT.

Вот хорошая статья по этой теме.

person Vadim    schedule 15.09.2009
comment
Пожалуйста, проверьте мою правку, чтобы прояснить проблему. Решение, которое вы предлагаете, не является моей проблемой: у меня уже есть newParentID, когда дочерняя вставка терпит неудачу. - person callisto; 15.09.2009