NHibernate错误消息:此计数为3的SqlParameterCollection的索引3无效

NHibernate错误消息:此计数为3的SqlParameterCollection的索引3无效,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我的测试数据库设计如下: 以下是伪代码: //BhillHeader public class BillHeader { public BillHeader() { BillDetails = new List<BillDetail>(); } public virtual int BillNo { get; set; } public virtual IList<BillDetail> BillDetails {

我的测试数据库设计如下:

以下是伪代码:

//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;
    }
}
//BhillHeader
公共类掘进机
{
公众收费表()
{
BillDetails=新列表();
}
公共虚拟整数BillNo{get;set;}
公共虚拟IList BillDetails{get;set;}
公共虚拟十进制数{get;set;}
公共虚拟void AddDetail(BillDetail billdet)
{
BillDetails.Add(billdet);
}
}  
//标题图
公共类BillHeaderMap:ClassMap
{
公共BillHeaderMap()
{
表格(“票据抬头”);
懒散的负荷();
Id(x=>x.BillNo).GeneratedBy.Identity()列(“BillNo”);
Map(x=>x.Amount).Column(“Amount”).Not.Nullable();
HasMany(x=>x.BillDetails).KeyColumn(“BillNo”).Cascade.All().Inverse();
}
}  
//账单明细
公共类公告栏详情
{
公共BillDetail(){}
公共虚拟int-BillID{get;set;}
公共虚拟int SeqNo{get;set;}
公共虚拟BillHeader BillHeader{get;set;}
公共虚拟十进制数{get;set;}
公共覆盖布尔等于(对象对象对象)
{
var other=obj作为BillDetail;
if(ReferenceEquals(null,other))返回false;
if(ReferenceEquals(this,other))返回true;
返回this.BillID==other.BillID&&
this.SeqNo==其他.SeqNo;
}
公共覆盖int GetHashCode()
{
未经检查{
int hash=GetType().GetHashCode();
hash=(hash*31)^SeqNo.GetHashCode();
哈希=(哈希*31)^BillID.GetHashCode();
返回散列;
}
}
}
//BillDetail地图
公共类BillDetailMap:ClassMap
{
公共BillDetailMap()
{
表(“账单明细”);
懒散的负荷();
CompositeId().KeyProperty(x=>x.BillID,“BillNo”).keyperty(x=>x.SeqNo,“SeqNo”);
参考(x=>x.BillHeader)。列(“BillNo”);
Map(x=>x.Amt).Column(“Amt”).Not.Nullable();
}
}
//-----------------------------------------------------------------------------------------------------------------------------
//节目
公营机构
{
var sessionFactory=CreateSessionFactory();
使用(var session=sessionFactory.OpenSession()){
使用(var sqlTrans=session.BeginTransaction()){
BillHeader billNo1=新BillHeader(){Amount=2500.00M};
BillDetail bh11=新BillDetail(){SeqNo=1,金额=200.00M};
BillDetail bh12=新BillDetail(){SeqNo=2,金额=300.00M};
BillDetail bh13=新BillDetail(){SeqNo=3,金额=500.00M};
添加BillDetails至BillHeader(billNo1、bh11、bh12、bh13);
会话。保存或更新(BillNo 1);
提交();
}
}
}
私有void AddBillDetailsToBillHeader(BillHeader BillHeader,参数BillDetail[]billDetails)
{
foreach(billDetails中的var billdet){
billHeader.AddDetail(billdet);
billdet.BillHeader=BillHeader;
}
}
当我运行此命令时,会出现以下异常:

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


请帮助我解决此问题。

很可能是因为列“BillNo”映射了两次,它试图为一列添加两个参数,因此出现outOfRange错误。将引用移动到compositekey中

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

//参考文献(x=>x.)。列(“比尔诺”);很可能是因为列“BillNo”映射了两次,所以它尝试为一列添加两个参数,从而得到outOfRange errorHi@Firo,谢谢您的帮助。这帮助我解决了这个问题。