如何调试“此带有计数 X 的 SqlParameterCollection 的索引 X 无效”

我正在开发一个用 C# 编写并使用 Fluent NHibernate 的项目。我收到臭名昭著的异常“此 SqlParameterCollection 的索引 X 与计数 X”。我已经尝试了来自不同 SO解决方案的几个建议,但我就是找不到映射问题。


读取数据时不会发生错误,只会在更新时发生。正在更新的表非常简单,因此该表的地图也很简单。当更新发生时,NHibernate 构造一个简单的单表更新查询,因此当错误发生时实际上并没有发生太多事情。


我的更新代码包含在交易中


using (var tx = Session.BeginTransaction())

{

    try

    {

         result = PerformUpdate(obj, modifiedBy);

         if (result.Succeeded)

         {

             tx.Commit();

             Session.Flush();

         }

         else 

             RollbackTransaction(tx);


         return result;

      }

      catch (Exception ex)

      {

          tx.Rollback();

          throw;

      }

   }

}

在 tx.Commit() 上抛出异常。


我相当有信心这是架构中某处的映射问题,但我找不到它。 如何检查 SqlParameters 列表以便调试它?必须有一种方法来检查 SqlParameters 列表,以便我可以看到不属于的内容。


繁华开满天机
浏览 96回答 1
1回答

鸿蒙传说

作为一个曾不幸与凌乱的遗留 Nhibernate 项目一起工作的人,我提出以下建议,让你的生活更轻松,并在充满敌意的领土上生存下来:1-“如果”您的数据库是 SQL Server:打开SQL Server 探查器并应用所需的过滤器(数据库名称和命令文本),以便您看到哪些 sql 命令被准确传递到服务器。对我来说,这将是起点。2- 如果 SQL Server 不是你的后端引擎,你在调试时最好的朋友是NHibernate 分析器。通过显示传递给服务器的每个参数的值以及最终查询,这正是您要查找的内容。它还显示打开的会话以及它们是否关闭。你可以下载试用版看看。3- 对于未来的代码手术,始终将您的项目配置为按需打开跟踪:使用Nhibernate 跟踪 NLog以记录正在传递给 sql server 的 sql 语句并将它们保存在单独的日志中。上面的工具和建议是我会尝试的,如果我被困在你的情况下。作为最后的提示:如果您使用上述方法未能找到问题,请自行解决问题并使用您自己的 SQL 本机语句运行更新。有时弄清楚为什么 NHibernate 没有生成所需的 SQL 语句比手动创建和执行更新语句花费更多的时间。这是你的最后一枪。听起来可能不干净,但大多数 NHibernate 项目无论如何都不干净。
打开App,查看更多内容
随时随地看视频慕课网APP