【问题标题】:Error updating in nHibernate: "Index was out of range."在 nHibernate 中更新错误:“索引超出范围。”
【发布时间】:2013-06-20 19:45:43
【问题描述】:

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

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

这可能是一些糟糕的映射。诊断此问题的最佳方法是什么?我真的很想看看它试图发布的 UPDATE。

代码如下:

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

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    如果您可以发布您的映射,它会有所帮助,但通常会在您使用 Fluent References 语法映射父 > 子关系时发生这种情况AND 还包括外键列的映射对于相同的关系。

    这会导致 nHibernate 两次映射该字段并导致您遇到的错误。

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

    为了严格回答所提出的问题(诊断自己),我建议 2 个选项:

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

    【讨论】:

    • 这正是它的本来面目——我们有一个引用和映射的外键。 nHProfiler 没有帮助,因为错误发生在之前并发出了 SQL。现在我知道要找什么了,不过,我下次可以得到这个。
    • 好,很高兴你解决了这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多