接收索引超出NHibernate的范围

接收索引超出NHibernate的范围,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我希望有人能帮我解决这个问题。我一直在绞尽脑汁 我的大脑和我的项目很快就要到期了。先谢谢你 插入新的索引时,我收到索引超出范围异常 记录。在无休止地搜索信息后,有人建议 映射中的列值数与映射中的列值数不匹配 持久类。然而,我数了又数,他们似乎在 匹配。从下面的代码可以看出,我正在使用 NHibernate.Mapping.Attributes来进行映射。也许我在做什么 有点不对劲 我最终下载了NHibernate源代码并通过我的 问题下面是NHibernate正在尝试的insert语句 建立:

我希望有人能帮我解决这个问题。我一直在绞尽脑汁 我的大脑和我的项目很快就要到期了。先谢谢你

插入新的索引时,我收到索引超出范围异常 记录。在无休止地搜索信息后,有人建议 映射中的列值数与映射中的列值数不匹配 持久类。然而,我数了又数,他们似乎在 匹配。从下面的代码可以看出,我正在使用 NHibernate.Mapping.Attributes来进行映射。也许我在做什么 有点不对劲

我最终下载了NHibernate源代码并通过我的 问题下面是NHibernate正在尝试的insert语句 建立:

{插入WTSLIB33T.PRODDATA(PSTAT、PCONO、PDVNO、PWKTY、PCRTY、, PTSID、PCNNO、PDTTK、PJBNO、PSJNO、PTKNO、PCWNO、PWKAR、PWKDC、PWKCD、, PCNWO、PWDNO、PDESC、PDCCD、PHRS、PUNIT、PSEQ、PCUST)值 (、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、)}

    public ProddataDAO(string PSTAT, decimal PCONO, decimal PDVNO, decimal PSEQ, string PWKTY, string PCRTY,
        decimal PTSID, decimal PCUST, decimal PCNNO, decimal PDTTK, string PJBNO, string PSJNO, decimal PTKNO,
        string PCWNO, string PWKAR, string PWKDC, string PWKCD, string PCNWO, decimal PWDNO, string PDESC, 
        decimal PDCCD, decimal PHRS, decimal PUNIT)
    {
        _PSTAT = PSTAT;
        _PCONO = PCONO;
        _PDVNO = PDVNO;
        _PSEQ = PSEQ;
        _PWKTY = PWKTY;
        _PCRTY = PCRTY;
        _PTSID = PTSID;
        _PCUST = PCUST;
        _PCNNO = PCNNO;
        _PDTTK = PDTTK;
        _PJBNO = PJBNO;
        _PSJNO = PSJNO;
        _PTKNO = PTKNO;
        _PCWNO = PCWNO;
        _PWKAR = PWKAR;
        _PWKDC = PWKDC;
        _PWKCD = PWKCD;
        _PCNWO = PCNWO;
        _PWDNO = PWDNO;
        _PDESC = PDESC;
        _PDCCD = PDCCD;
        _PHRS = PHRS;
        _PUNIT = PUNIT;
    }

    //public event PropertyChangedEventHandler PropertyChanged;

    private decimal _PSEQ;
    //[NHibernate.Mapping.Attributes.Id(0, Name="PSEQ", Column="PSEQ", Type="Decimal")]
    [NHibernate.Mapping.Attributes.CompositeId(1, UnsavedValue=NHibernate.Mapping.Attributes.UnsavedValueType.Undefined)]
    [NHibernate.Mapping.Attributes.KeyProperty(2, Name = "PSEQ", Column = "PSEQ", Type="Decimal")]
    [NHibernate.Mapping.Attributes.KeyProperty(2, Name = "PCUST", Column = "PCUST")]
    //[NHibernate.Mapping.Attributes.Generator(3, Class="none")]
    [NHibernate.Mapping.Attributes.Property(4, Name="PSEQ", Column="PSEQ")]
    public virtual decimal PSEQ
    {
        get
        {
            return _PSEQ;
        }
        set
        {
            if (value != this._PSEQ)
            {
                _PSEQ = value;
                //OnPropertyChanged("PSEQ");
            }
        }
    }

    private decimal _PCUST;

    //[NHibernate.Mapping.Attributes.Id(0, Column = "PCUST", Type = "Decimal")]
    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PCUST
    {
        get
        {
            return _PCUST;
        }
        set
        {
            if (value != this._PCUST)
            {
                _PCUST = value;
                //OnPropertyChanged("PCUST");
            }
        }
    }

    private string _PSTAT;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PSTAT
    {
        get
        {
            return _PSTAT;
        }
        set
        {
            if (value != this._PSTAT)
            {
                this._PSTAT = value;
                //OnPropertyChanged("PSTAT");
            }
        }
    }

    private decimal _PCONO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PCONO
    {
        get
        {
            return _PCONO;
        }
        set
        {
            if (value != this._PCONO)
            {
                _PCONO = value;
                //OnPropertyChanged("PCONO");
            }
        }
    }

    private decimal _PDVNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PDVNO
    {
        get
        {
            return _PDVNO;
        }
        set
        {
            if (value != this._PDVNO)
            {
                _PDVNO = value;
                //OnPropertyChanged("PDVNO");
            }
        }
    }

    private string _PWKTY;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PWKTY
    {
        get
        {
            return _PWKTY;
        }
        set
        {
            if (value != this._PWKTY)
            {
                _PWKTY = value;
                //OnPropertyChanged("PWKTY");
            }
        }
    }

    private string _PCRTY;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PCRTY
    {
        get
        {
            return _PCRTY;
        }
        set
        {
            if (value != this._PCRTY)
            {
                _PCRTY = value;
                //OnPropertyChanged("PCRTY");
            }
        }
    }

    private decimal _PTSID;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PTSID
    {
        get
        {
            return _PTSID;
        }
        set
        {
            if (value != this._PTSID)
            {
                _PTSID = value;
                //OnPropertyChanged("PTSID");
            }
        }
    }

    private decimal _PCNNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PCNNO
    {
        get
        {
            return _PCNNO;
        }
        set
        {
            if (value != this._PCNNO)
            {
                _PCNNO = value;
                //OnPropertyChanged("PCNNO");
            }
        }
    }

    private decimal _PDTTK;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PDTTK
    {
        get
        {
            return _PDTTK;
        }
        set
        {
            if (value != this._PDTTK)
            {
            _PDTTK = value;
            //OnPropertyChanged("PDTTK");
            }
        }
    }

    private string _PJBNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PJBNO
    {
        get
        {
            return _PJBNO;
        }
        set
        {
            if (value != this._PJBNO)
            {
            _PJBNO = value;
            //OnPropertyChanged("PJBNO");
            }
        }
    }

    private string _PSJNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PSJNO
    {
        get
        {
            return _PSJNO;
        }
        set
        {
            if (value != this._PSJNO)
            {
            _PSJNO = value;
            //OnPropertyChanged("PSJNO");
            }
        }
    }

    private decimal _PTKNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PTKNO
    {
        get
        {
            return _PTKNO;
        }
        set
        {
            if (value != this._PTKNO)
            {
            _PTKNO = value;
            //OnPropertyChanged("PTKNO");
            }
        }
    }

    private string _PCWNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PCWNO
    {
        get
        {
            return _PCWNO;
        }
        set
        {
            if (value != this._PCWNO)
            {
            _PCWNO = value;
            //OnPropertyChanged("PCWNO");
            }
        }
    }

    private string _PWKAR;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PWKAR
    {
        get
        {
            return _PWKAR;
        }
        set
        {
            if (value != this._PWKAR)
            {
            _PWKAR = value;
            //OnPropertyChanged("PWKAR");
            }
        }
    }

    private string _PWKDC;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PWKDC
    {
        get
        {
            return _PWKDC;
        }
        set
        {
            if (value != this._PWKDC)
            {
            _PWKDC = value;
            //OnPropertyChanged("PWKDC");
            }
        }
    }

    private string _PWKCD;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PWKCD
    {
        get
        {
            return _PWKCD;
        }
        set
        {
            if (value != this._PWKCD)
            {
            _PWKCD = value;
            //OnPropertyChanged("PWKCD");
            }
        }
    }

    private string _PCNWO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PCNWO
    {
        get
        {
            return _PCNWO;
        }
        set
        {
            if (value != this._PCNWO)
            {
            _PCNWO = value;
            //OnPropertyChanged("PCNWO");
            }
        }
    }

    private decimal _PWDNO;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PWDNO
    {
        get
        {
            return _PWDNO;
        }
        set
        {
            if (value != this._PWDNO)
            {
            _PWDNO = value;
            //OnPropertyChanged("PWDNO");
            }
        }
    }

    private string _PDESC;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual string PDESC
    {
        get
        {
            return _PDESC;
        }
        set
        {
            if (value != this._PDESC)
            {
            _PDESC = value;
            //OnPropertyChanged("PDESC");
            }
        }
    }

    private decimal _PDCCD;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PDCCD
    {
        get
        {
            return _PDCCD;
        }
        set
        {
            if (value != this._PDCCD)
            {
            _PDCCD = value;
            //OnPropertyChanged("PDCCD");
            }
        }
    }

    private decimal _PHRS;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PHRS
    {
        get
        {
            return _PHRS;
        }
        set
        {
            if (value != this._PHRS)
            {
                _PHRS = value;
                //OnPropertyChanged("PHRS");
            }
        }
    }

    private decimal _PUNIT;

    [NHibernate.Mapping.Attributes.Property(4)]
    public virtual decimal PUNIT
    {
        get
        {
            return _PUNIT;
        }
        set
        {
            if (value != this._PUNIT)
            {
                _PUNIT = value;
                //OnPropertyChanged("PUNIT");
            }
        }
    }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        ProddataDAO p = obj as ProddataDAO;

        if (this.PCONO == p.PCONO && this.PDVNO == p.PDVNO && this.PCUST == p.PCUST && this.PSEQ == p.PSEQ)
            return true;
        else
            return false;
    }

    public override int GetHashCode()
    {
        int hash = 1122;

        hash += (null == this.PCONO ? 0 : this.PCONO.GetHashCode());
        hash += (null == this.PDVNO ? 0 : this.PDVNO.GetHashCode());
        hash += (null == this.PCUST ? 0 : this.PCUST.GetHashCode());
        hash += (null == this.PSEQ ? 0 : this.PSEQ.GetHashCode());

        return hash;
    } 
如您所见,参数的数量与字段的数量相匹配 在名单上。我还将生成的insert与我的类进行了匹配 我发现PSEQ和PCUST列出现了问题 和我坚持不懈的班级。然后,在调试过程中通过脱水 功能我发现了两个可能的问题。首先,我注意到 对NullSafeSet函数的调用将参数0设置为我的PSEQ值 字段应设置为,但insert语句中的参数0为 PSTAT

我注意到的第二个问题是最后一次调用“索引”+= ArrayHelper.CountTrue(includeColumns[i]);“在脱水函数中 将索引变量保留为23,这是正确的;然而,接下来 调用“IdentifierType.NullSafeSet(语句、id、索引、, session);”,其中它检查行id,并传入索引23,其中 会超出范围。对于以零为基础的系统,该值应为22 数组



此问题的一个可能原因是您已将两个属性映射到同一列。例如,您已经将外键关系映射为关系和属性字段,或者您已经将描述符映射为字段

查看主键映射,我发现它映射了两次:

[NHibernate.Mapping.Attributes.CompositeId(1, UnsavedValue=NHibernate.Mapping.Attributes.UnsavedValueType.Undefined)]
[NHibernate.Mapping.Attributes.KeyProperty(2, Name = "PSEQ", Column = "PSEQ", Type="Decimal")]
[NHibernate.Mapping.Attributes.KeyProperty(2, Name = "PCUST", Column = "PCUST")]
//[NHibernate.Mapping.Attributes.Generator(3, Class="none")]
[NHibernate.Mapping.Attributes.Property(4, Name="PSEQ", Column="PSEQ")]
您确定这是使用NHiberante属性映射复合键的方法吗?我自己没用过。但我的猜测是,正是这一点导致NHibernate认为您已经映射了列PSEQ两次

我认为您应该只使用KeyProperty并跳过属于主键的属性的Property属性。 尝试将其添加到类的顶部(不要修饰属性声明)


找到这个leated论坛线程:

我在使用XML映射时遇到了类似的情况,我们最初在.hbm.XML中包含了“parent id”列,然后当我们通过多对一标记添加back引用时,我收到了索引超出范围异常。删除原始声明是关键



没有映射文件,因为我正在使用NHibernate.mapping.Attributes。我在描述中解释了这一点,并在代码中显示了这一点。这些属性允许我标记代码,这样我就不必维护映射文档。但是谢谢你的评论。我的感觉是映射属性有问题,或者它们有缺陷。我希望有人能解释一下。对不起,我没有把问题读得足够透彻。我想你是对的,这可能是NHiberantes映射属性。如果您两次映射同一列,我将更新我的回答,这很有帮助,谢谢。我之所以有这个属性,是因为在我开发过程的早期,我收到了错误,没有把它放在那里,即使是其他关键属性。我不确定为什么会发生这种情况,但我确实知道,由于更新的工作方式,我将复合键移到了文件的末尾。谁知道呢,但再次感谢你。asgerhallas,根据releasenotes.txt,它是:为NHibernate构建2.1.1.GA(rev4814)。映射属性dll为2.1.0可能重复:
[NHibernate.Mapping.Attributes.CompositeId(1, UnsavedValue=NHibernate.Mapping.Attributes.UnsavedValueType.Undefined)]
[NHibernate.Mapping.Attributes.KeyProperty(2, Name = "PSEQ", Column = "PSEQ", Type="Decimal")]
[NHibernate.Mapping.Attributes.KeyProperty(2, Name = "PCUST", Column = "PCUST")]
//[NHibernate.Mapping.Attributes.Generator(3, Class="none")]
[NHibernate.Mapping.Attributes.Property(4, Name="PSEQ", Column="PSEQ")]
[CompositeId(1,UnsavedValue=UnsavedValueType.Undefined)]
[KeyProperty(2, Name="PSEQ", Column="PSEQ")] 
[KeyProperty(4, Name="PCUST", Column="PCUST")] 
<class name="IncomeDetail" table="INCOMEDETAILS" mutable="true" lazy="false">

    <id name="IncomeDetailID" column="INCOME_DETAIL_ID">
        <generator class="native" />
    </id>

    <property name='ParticipantID' column='PARTICIPANT_ID' type='Int32'/>
    <property name='IncomeGroupCD' column='INCOME_GROUP_CD' type='String'/>
    <property name='IncomeTypeID' column='INCOME_TYPE_ID' type='Int32'/>
    <!--<property name='EmploymentID' column='EMPLOYMENT_ID' type='Int32'/>-->
    <property name='IncomeFrequencyCD' column='INCOME_FREQUENCY_CD' type='String'/>
    <property name='CapturedDetGrossIncomeAmt' column='CAPTURED_DET_GROSS_INCOME_AMT' type='Decimal'/>
    <property name='CapturedDetNetIncomeAmt' column='CAPTURED_DET_NET_INCOME_AMT' type='Decimal'/>
    <property name='VerifiedDetGrossIncomeAmt' column='VERIFIED_DET_GROSS_INCOME_AMT' type='Decimal'/>
    <property name='VerifiedDetNetIncomeAmt' column='VERIFIED_DET_NET_INCOME_AMT' type='Decimal'/>
    <property name='IncomeDesc' column='INCOME_DESC' type='String'/>
    <property name='CapturedDT' column='CAPTURED_DT' type='DateTime' not-null='true'/>
    <property name='CapturedBy' column='CAPTURED_BY' type='String' not-null='true'/>
    <property name='VerificationDT' column='VERIFICATION_DT' type='DateTime' />
    <property name='VerifiedBy' column='VERIFIED_BY' type='String' />
    <property name='VefificationSourceCD' column='VEFIFICATION_SOURCE_CD' type='String'/>

    <many-to-one name="EmploymentIncome" column="EMPLOYMENT_ID" />

</class>