1

我正在使用 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() 遇到异常,错误是 TableB 中的 ParentID 在 TableA 中没有匹配的主键条目。

连接被重用。

我该如何解决这个问题?在 TableA 上执行 SELECT WITH (NOLOCK) 确实会显示新插入的父记录,但下面的子记录插入看不到它。

编辑澄清:在foreach循环中,我已经插入但未提交的新 ParentID。问题是插入到孩子的 TableB 失败,因为父 TableA 的 TableB 中的 FK 看不到未提交的新 TableA PK ID。

4

2 回答 2

0

如果您有一个标识列,您可以尝试在 INSERT 语句中使用OUTPUT INSERTED子句。

这是一篇关于这个主题的好文章。

于 2009-09-15T11:20:25.747 回答
0

附注 - 您必须使用 TransactionScope.Complete 实例方法显式完成事务,否则它会回滚。

于 2009-09-15T11:22:43.180 回答