Subsonic 亚音速事务-使用第一个表的返回标识插入第二个表

Subsonic 亚音速事务-使用第一个表的返回标识插入第二个表,subsonic,subsonic3,Subsonic,Subsonic3,我使用下面的代码用第一个表中使用的标识(Info2.Id=info.Id;)更新第二个表(Info2)。当执行第二次保存(info2.save())时,我得到一个错误:“已经有一个与此命令关联的打开的DataReader,必须先关闭它。”。 谁能看出我做错了什么 亚音速版本3.0.0.3和SQL Server 2005 谢谢 using (SharedDbConnectionScope sharedConnectionScope = new SharedDbCon

我使用下面的代码用第一个表中使用的标识(Info2.Id=info.Id;)更新第二个表(Info2)。当执行第二次保存(info2.save())时,我得到一个错误:“已经有一个与此命令关联的打开的DataReader,必须先关闭它。”。 谁能看出我做错了什么

亚音速版本3.0.0.3和SQL Server 2005

谢谢

                using (SharedDbConnectionScope sharedConnectionScope = new SharedDbConnectionScope())
                {
                    using (TransactionScope ts = new TransactionScope())
                    {
                        Info info = new Info();
                        info.Desc = "Some information";
                        info.Save();

                        Info2 info2 = new Info2();
                        info2.Id = info.Id;
                        info2.Desc = "More information";
                        info2.Save();

                        ts.Complete();
                    }
                }

看起来您的TransactionScope和SharedDbConnectionScope设置错误,请尝试:

using (TransactionScope ts = new TransactionScope())
{
  using (SharedDbConnectionScope sharedConnectionScope = new SharedDbConnectionScope())
  {
    Info info = new Info();
    info.Desc = "Some information";
    info.Save();

    Info2 info2 = new Info2();
    info2.Id = info.Id;
    info2.Desc = "More information";
    info2.Save();

    ts.Complete();
  }
}

根据我在评论中所写的内容,我能让这项工作正常进行的唯一方法是首先使用TransactionScope,然后使用SharedDbConnectionScope(感谢Adam),并添加MultipleActiveResultSets=True;(SQLServer2005)连接到连接字符串

有谁有更好的解决方案或其他建议吗? 谢谢


我认为这个错误将永远伴随着亚音速用户。前一段时间的文件里是错误的。为了记住正确的顺序,我总是记得连接需要知道事务,因此事务首先进行。通过从TransactionScope行中删除括号。使用嵌套的using子句使其更具可读性。
        try
        {
            using (TransactionScope ts = new TransactionScope())
            {
                using (SharedDbConnectionScope scs = new SharedDbConnectionScope())
                {
                    Info info = new Info();
                    info.Desc = "Some information";
                    info.Save();

                    //Test for rollback
                    //throw new Exception("STOP");

                    Info2 info2 = new Info2();
                    info2.Id = info.Id;
                    info2.Desc = "More information";
                    info2.Save();

                    ts.Complete();
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }