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