我正在研究一个用C#编写并使用Fluent NHibernate的项目。我收到了臭名昭著的异常“此CountParameter X的SqlParameterCollection的无效索引X”。我尝试了来自不同SO solutions的一些建议,但我只是找不到映射问题。
仅在更新时,读取数据时永远不会发生错误。要更新的表非常简单,因此该表的映射也很简单。当更新发生时,NHibernate会构造一个简单的单表更新查询,因此发生错误时实际上并没有发生什么。
我的更新代码包含在交易中
Sub Main()
Dim s1 As String() = {"a", "b", "c", "d"}
Dim s2 As Integer() = {1, 2, 3}
Console.WriteLine("Nested For Each Loops")
For Each s1Item As String In s1
For Each s2Item As Integer In s2
Dim m As String = $"{s1Item}, {s2Item}"
Console.WriteLine(m)
Next
Next
Console.WriteLine()
Console.WriteLine("Single For Loop, leveraging array indices")
Dim itemsLengthMinimum As Integer = {s1.Length, s2.Length}.Min()
For itemsIndex As Integer = 0 To itemsLengthMinimum - 1
Dim s1Item As String = s1(itemsIndex)
Dim s2Item As Integer = s2(itemsIndex)
Dim m As String = $"{s1Item}, {s2Item}"
Console.WriteLine(m)
Next
Console.WriteLine()
Console.WriteLine("Single For Each Loop, using Zip to return Object array")
For Each pairedItem As Object() In s1.Zip(s2, Function(s1Item, s2Item) {s1Item, s2Item})
Dim m As String = $"{pairedItem(0)}, {pairedItem(1)}"
Console.WriteLine(m)
Next
Console.WriteLine()
Console.WriteLine("Single For Each Loop, using Zip to return Tuple")
For Each pairedItem As Tuple(Of String, Integer) In s1.Zip(s2, Function(s1Item, s2Item) New Tuple(Of String, Integer)(s1Item, s2Item))
Dim m As String = $"{pairedItem.Item1}, {pairedItem.Item2}"
Console.WriteLine(m)
Next
Console.WriteLine()
Console.WriteLine("Press any key to end...")
Console.ReadKey()
End Sub
在tx.Commit()上引发了异常。
我非常有信心这是架构中某处的映射问题,但我找不到它。 如何检查SqlParameters列表以便调试?必须有一种检查SqlParameters列表的方法,以便查看不属于什么。
答案 0 :(得分:3)
作为一个不幸的人,他很高兴与混乱的传统Nhibernate项目一起工作,我建议您采取以下措施,使您的生活更轻松,并在充满敌意的领土中生存:
1-“如果”您的数据库是SQL Server:打开SQL Server profiler并应用所需的过滤器(数据库名称和命令文本),以便您看到将什么sql命令准确传递给服务器。对我来说,这就是起点。
2-如果SQL Server不是您的后端引擎,那么在调试时最好的朋友是NHibernate profiler。通过显示传递给服务器的每个参数的值以及最终查询,可以完全满足您的需求。它还显示打开的会话以及它们是否关闭。您可以下载试用版并查看。
3-为了将来进行代码外科手术,请始终将项目配置为按需打开跟踪:按照NLog with Nhibernate记录要传递到sql server的sql语句,并将它们保存在单独的日志中。
如果我会陷入困境,以上是我会尝试的工具和建议。
最后一个技巧:如果您无法使用上述方法找到问题,请亲自解决问题,并使用自己的SQL本机语句运行更新。有时弄清楚为什么NHibernate不产生所需的SQL语句比手动创建和执行update语句花费更多的时间。这是您的最后也是最后一枪。听起来可能并不干净,但是大多数NHibernate项目还是不干净。