在nHibernate中更新错误:"索引超出范围."

Dan*_*ams 3 nhibernate fluent-nhibernate

在FNH中调用更新时,我收到以下错误:

指数超出范围.必须是非负数且小于集合的大小.\ r \nParameter name:index

这可能是一些不好的映射.诊断这个的最佳方法是什么?我真的很想看到它试图发布的UPDATE.

这是代码:

    public void Update<T>(IEnumerable<T> values)
    {
            foreach (var value in values)
            {
                using (var tx = Session.BeginTransaction())
                {
                    this.Update(value, tx);
                    tx.Commit();
                }
        }
    }
Run Code Online (Sandbox Code Playgroud)

CSL*_*CSL 7

如果你可以发布你的映射它会有所帮助,但通常这会在你使用Fluent References语法映射Parent> Child关系时发生,并且还包含相同关系的Foreign Key列的Mapping.

这会导致nHibernate将字段映射两次,从而导致您遇到的错误.

当您使用References语法时,nHibernate将为您处理Foreign Key列,但是如果您仍然希望它在您的对象中,只需更改该字段的映射定义即可ReadOnly()选择解决问题.如果您不需要它,可以完全从映射定义中删除.

要严格回答问题(诊断自己),我建议2个选项:

  • 自由选项 - 安装log4Net并配置nHibernate以将其所有SQL语句输出到记录器组件.这样,您将在日志文件中看到违规语句,并能够隔离问题.
  • 成本选项 - 由Hibernating Rhinos 下载和试用/购买nHibernate Profiler.它将为您提供nHibernate发送到数据库的所有SQL语句的完整详细信息,包括改进的建议或警告,以及一个漂亮的GUI.