Сбой в вставке - PullRequest
       27

Сбой в вставке

1 голос
/ 15 сентября 2009

Я использую 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. Проблема заключается в том, что вставка в дочернюю таблицу B завершается неудачно, поскольку FK в TableB для родительской таблицы TableA не может увидеть некоммитированный новый идентификатор TableA PK.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2009

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

0 голосов
/ 15 сентября 2009

Если у вас есть столбец идентификаторов, вы можете попытаться использовать предложение OUTPUT INSERTED в своем выражении INSERT.

Вот хорошая статья на эту тему.

...