如何调试 "Invalid index X for this SqlParameterCollection with Count X"

How do I debug "Invalid index X for this SqlParameterCollection with Count X"

我正在开发一个用 C# 编写并使用 Fluent NHibernate 的项目。我遇到了臭名昭著的异常 "Invalid index X for this SqlParameterCollection with Count X"。我已经尝试了来自不同 SO solutions 的几个建议,但我就是找不到映射问题。

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

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

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 列表以便我可以看到不属于的内容。

作为一个有幸参与凌乱的遗留 Nhibernate 项目的人,我提出以下建议,让您的生活更轻松,并在充满敌意的领土上生存下来:

1- "If" 您的数据库是 SQL 服务器:打开 SQL Server profiler 并应用所需的过滤器(数据库名称和命令文本),以便您看到 sql命令被准确地传递到服务器。对我来说,这将是起点。

2- 如果 SQL 服务器不是您的 back-end 引擎,您在调试时最好的朋友将是 NHibernate profiler。通过显示传递给服务器的每个参数的值以及最终查询,这正是您要查找的内容。它还显示打开的会话以及它们是否关闭。大家可以下载试用版看看

3- 对于未来的代码手术,始终将您的项目配置为按需打开跟踪:按照 NLog with Nhibernate 记录哪些 sql 语句被传递到 sql 服务器并保存它们在单独的日志中。

以上工具和建议是我会尝试的,如果我遇到你的情况的话。

作为最后的提示:如果您使用上述方法未能找到问题,请自行解决问题并运行 使用您自己的 SQL 本地语句进行更新.有时弄清楚为什么 NHibernate 没有生成所需的 SQL 语句比手动创建和执行更新语句花费更多的时间。这是你的最后一枪。听起来可能不干净,但大多数 NHibernate 项目都不干净。