NHibernate的错误消息:该Count = 3的SqlParameterCollection索引3无效 [英] NHibernate Error Message: Invalid index 3 for this SqlParameterCollection with Count=3

查看:139
本文介绍了NHibernate的错误消息:该Count = 3的SqlParameterCollection索引3无效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



以下是伪代码:

  // BhillHeader 
公共类BillHeader
{
public BillHeader()
{
BillDetails = new List< BillDetail>();
}
public virtual int BillNo {get;组; }
公共虚拟IList< BillDetail> BillDetails {get;组; }
public virtual decimal Amount {get;组; }

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



// BillHeader映射
public class BillHeaderMap:ClassMap< BillHeader>
{

public BillHeaderMap()
{
表(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();


$ b // BillDetail
public class BillDetail
{
public BillDetail(){}
public virtual int BillID {get;组; }
public virtual int SeqNo {get;组; }
public virtual BillHeader BillHeader {get;组; }
public virtual decimal Amt {get;组; }
$ b public override bool Equals(object obj)
{
var other = obj as BillDetail;

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

返回this.BillID == other.BillID&&
this.SeqNo == other.SeqNo;

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

返回散列;




$ b // BillDetail Map
public class BillDetailMap:ClassMap< BillDetail>


公共BillDetailMap()
{
表(BillDetail);
LazyLoad();
CompositeId()。KeyProperty(x => x.BillID,BillNo)。KeyProperty(x => x.SeqNo,SeqNo);
引用(x => x.BillHeader).Column(BillNo);
Map(x => x.Amt).Column(Amt)。Not.Nullable();
}
}


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

//程序
public createBillNo()
{
var sessionFactory = CreateSessionFactory();
使用(var session = sessionFactory.OpenSession()){
using(var sqlTrans = session.BeginTransaction()){

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

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



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


$ / code $ / pre

当我运行这个时,我得到下面的异常:b
$ b


此计数= 3的SqlParameterCollection的索引3无效

请帮我解决这个问题。最可能是因为列BillNo被映射了两次,它试图为1列添加2个参数,因此outOfRange错误。将引用移动到组合键中

$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $' )
.KeyProperty(x => x.SeqNo,SeqNo);
//引用(x => x。)。Column(BillNo); < - 删除


I have a test database design like this:

The following is the pseudo-code:

//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;
    }
}

When I run this I'm getting the following exception:

Invalid index 3 for this SqlParameterCollection with Count=3

Please help me to resolve this issue.

解决方案

most probably because column "BillNo" is mapped twice, it tries to add 2 parameter for 1 column, hence the outOfRange error. move the reference into the compositekey

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

这篇关于NHibernate的错误消息:该Count = 3的SqlParameterCollection索引3无效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆