更新nHibernate中的错误:“0”;索引超出范围。”;

更新nHibernate中的错误:“0”;索引超出范围。”;,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,在FNH中调用更新时,出现以下错误: 索引超出范围。必须为非负且小于集合的大小。\r\n参数名称:索引 这可能是一些错误的映射。诊断这个的最好方法是什么?我真的很想看到它试图发布的更新 代码如下: public void Update<T>(IEnumerable<T> values) { foreach (var value in values) { using (var t

在FNH中调用更新时,出现以下错误:

索引超出范围。必须为非负且小于集合的大小。\r\n参数名称:索引

这可能是一些错误的映射。诊断这个的最好方法是什么?我真的很想看到它试图发布的更新

代码如下:

    public void Update<T>(IEnumerable<T> values)
    {
            foreach (var value in values)
            {
                using (var tx = Session.BeginTransaction())
                {
                    this.Update(value, tx);
                    tx.Commit();
                }
        }
    }
public void更新(IEnumerable值)
{
foreach(值中的var值)
{
使用(var tx=Session.BeginTransaction())
{
更新(值,tx);
tx.Commit();
}
}
}

如果您可以发布映射,这会有所帮助,但通常情况下,当您使用Fluent
引用映射父级>子级关系时,会出现这种情况,并且
语法还包含了相同关系的外键列映射

这将导致nHibernate映射字段两次,并导致您遇到的错误

使用References语法时,nHibernate会为您处理外键列,但是如果您仍然希望它出现在对象中,只需更改该字段的映射定义,使其具有
ReadOnly()
选项即可解决此问题。如果不需要它,可以从映射定义中完全删除它

为了严格回答问题(诊断自己),我建议两种选择:

  • 免费选项-安装
    log4Net
    并配置nHibernate以将其所有SQL语句输出到记录器组件。这样,您将在日志文件中看到有问题的语句,并能够隔离问题
  • 成本选项-下载和试用/购买休眠犀牛。它将为您提供nHibernate发送到数据库的所有SQL语句的完整细节,并提供改进建议或警告,所有这些都在一个漂亮的GUI中

这就是它原来的样子-我们有一个引用和外键都映射了。nHProfiler没有帮助,因为之前发生了错误,并且发出了SQL。现在我知道该找什么了,不过,下次我可以得到这个。很好,我很高兴你解决了这个问题