nhibernate - 使用 NHibernate 接收超出范围的索引

标签 nhibernate nhibernate-mapping

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

插入新索引时收到索引超出范围异常
记录。在无休止的搜索信息后,建议
我的映射中的列值的数量与我的不匹配
持久类。然而,我数了又数,他们似乎
匹配。正如您在下面的代码中看到的那样,我正在使用
NHibernate.Mapping.Attributes 来做我的映射。也许我在做
那里有问题。

我终于下载了 NHibernate 源并通过我的调试
问题。下面是 NHibernate 正在尝试的插入语句
build :

{插入 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) 值
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}

可以看到,参数的数量与字段的数量相匹配
在列表中。我还将这个生成的插入与我的类(class)相匹配
我发现 PSEQ 和 PCUST 列乱序了
和我坚持不懈的类(class)。然后,一边调试一边通过 Dehydrate
功能我发现了两个可能的问题。首先是我注意到
对 NullSafeSet 函数的调用将参数 0 设置为我的 PSEQ
字段应设置为但插入语句中的参数 0 是
统计数据。

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

protected int Dehydrate(object id, object[] fields, object rowId, bool[] includeProperty, bool[][] includeColumns, int table, IDbCommand statement, ISessionImplementor session, int index)
            {
                    if (log.IsDebugEnabled)
                    {
log.Debug("Dehydrating entity: " + MessageHelper.InfoString(this, id, Factory));
                }
// there's a pretty strong coupling between the order of the SQL parameter
// construction and the actual order of the parameter collection.

for (int i = 0; i < entityMetamodel.PropertySpan; i++)
{
    if (includeProperty[i] && IsPropertyOfTable(i, table))
{
    PropertyTypes[i].NullSafeSet(statement, fields[i], index, includeColumns[i], session);
    index += ArrayHelper.CountTrue(includeColumns[i]); 
}
if (rowId != null)
{
    // TODO H3.2 : support to set the rowId
    // TransactionManager.manager.SetObject(ps, index, rowId);
    // index += 1;
    throw new NotImplementedException("support to set the rowId");
}
else if (id != null)
{
    IdentifierType.NullSafeSet(statement, id, index, session);
    index += IdentifierColumnSpan;
}
return index;

}

我的持久类(class):

[NHibernate.Mapping.Attributes.Class(0,架构 = WTSLIB33T,表 =
"PRODDATA", NameType = typeof(ProddataDAO),
懒惰=真)]
公共(public)类 ProddataDAO : Object//: INotifyPropertyChanged
{
公共(public) ProddataDAO()
{
}
    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;
    } 

最佳答案

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

查看主键映射,我看到它被映射了两次:

[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 属性。
尝试在类的顶部添加它(不要装饰属性声明)
[CompositeId(1,UnsavedValue=UnsavedValueType.Undefined)]
[KeyProperty(2, Name="PSEQ", Column="PSEQ")] 
[KeyProperty(4, Name="PCUST", Column="PCUST")] 

找到这个 leated 论坛主题:https://forum.hibernate.org/viewtopic.php?f=25&t=964631&start=0

关于nhibernate - 使用 NHibernate 接收超出范围的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1902219/

相关文章:

nhibernate - 将 IUserType 映射到流利的 NHibernate 中的组件属性

c# - NHibernate DuplicateMappingException 当两个类具有相同的名称但不同的命名空间时

java - 如何使用hibernate更新数据库?

fluent-nhibernate - 为什么我的 NHibernate 查询因 IndexOutOfRangeException 而失败?

c# - Fluent NHibernate - 当模型中不存在显式父->子关系时级联删除子对象

c# - 具有相同主键的 FluentNHibernate 映射

nhibernate - 使用 NHibernate Linq 查询制定内部联接时遇到问题

NHibernate 多列 ManyToOne 映射与映射代码

nhibernate - 我如何使用 nhibernate 动态地延迟/急切加载

nhibernate - NHibernate:使用Fluent Nhibernate保存子对象