【问题标题】:NHibernate Error Message: Invalid index 3 for this SqlParameterCollection with Count=3NHibernate 错误消息:此 SqlParameterCollection 的索引 3 无效,Count=3
【发布时间】:2023-03-28 17:35:01
【问题描述】:

我有一个这样的测试数据库设计:

以下是伪代码:

//BhillHeader
public class BillHeader
{
    public BillHeader()
    {
        BillDetails = new List<BillDetail>();
    }
    public virtual int BillNo { get; set; }
    public virtual IList<BillDetail> BillDetails { get; set; }
    public virtual decimal Amount { get; set; }

    public virtual void AddDetail(BillDetail billdet)
    {
        BillDetails.Add(billdet);
    }
}  

//BillHeader Map
public class BillHeaderMap : ClassMap<BillHeader>
{

    public BillHeaderMap()
    {
        Table("BillHeader");
        LazyLoad();
        Id(x => x.BillNo).GeneratedBy.Identity().Column("BillNo");
        Map(x => x.Amount).Column("Amount").Not.Nullable();
        HasMany(x => x.BillDetails).KeyColumn("BillNo").Cascade.All().Inverse();
    }
}  

//BillDetail
public class BillDetail
{
    public BillDetail() { }
    public virtual int BillID { get; set; }
    public virtual int SeqNo { get; set; }
    public virtual BillHeader BillHeader { get; set; }
    public virtual decimal Amt { get; set; }

    public override bool Equals(object obj)
    {
        var other = obj as BillDetail;

        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;

        return this.BillID == other.BillID &&
            this.SeqNo == other.SeqNo;
    }

    public override int GetHashCode()
    {
        unchecked {
            int hash = GetType().GetHashCode();
            hash = (hash * 31) ^ SeqNo.GetHashCode();
            hash = (hash * 31) ^ BillID.GetHashCode();

            return hash;
        }
    }
}


//BillDetail Map
public class BillDetailMap : ClassMap<BillDetail>
{

    public BillDetailMap()
    {
        Table("BillDetail");
        LazyLoad();
        CompositeId().KeyProperty(x => x.BillID, "BillNo").KeyProperty(x => x.SeqNo, "SeqNo");
        References(x => x.BillHeader).Column("BillNo");
        Map(x => x.Amt).Column("Amt").Not.Nullable();
    }
}


//-----------------------------------------------------------------------------------------------------------------------------

//Program
public createBillNo()
{
    var sessionFactory = CreateSessionFactory();
    using (var session = sessionFactory.OpenSession()) {
        using (var sqlTrans = session.BeginTransaction()) {

            BillHeader billNo1 = new BillHeader() { Amount = 2500.00M};
            BillDetail bh11 = new BillDetail() { SeqNo = 1, Amt = 200.00M };
            BillDetail bh12 = new BillDetail() { SeqNo = 2, Amt = 300.00M };
            BillDetail bh13 = new BillDetail() { SeqNo = 3, Amt = 500.00M };

            AddBillDetailsToBillHeader(billNo1, bh11, bh12, bh13);
            session.SaveOrUpdate(billNo1); 
            sqlTrans.Commit();
        }
    }
}

private void AddBillDetailsToBillHeader(BillHeader billHeader, params BillDetail[] billDetails)
{
    foreach (var billdet in billDetails) {
        billHeader.AddDetail(billdet);
        billdet.BillHeader = billHeader;
    }
}

当我运行它时,我得到了以下异常:

Count=3 的此 SqlParameterCollection 的索引 3 无效

请帮我解决这个问题。

【问题讨论】:

  • 很可能是因为“BillNo”列被映射了两次,它尝试为 1 列添加 2 个参数,因此出现 outOfRange 错误

标签: nhibernate fluent-nhibernate nhibernate-mapping


【解决方案1】:

很可能是因为列“BillNo”被映射了两次,它尝试为 1 列添加 2 个参数,因此出现 outOfRange 错误。将引用移动到复合键中

CompositeId()
    .KeyReference(x => x.BillHeader, "BillNo")
    .KeyProperty(x => x.SeqNo, "SeqNo");
// References(x => x.).Column("BillNo");  <-- Remove

【讨论】:

  • 嗨@Firo,感谢您的帮助。这帮助我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多