2011-11-09 9 views
6

ho una progettazione di database test come questo: enter image description hereMessaggio di errore NHibernate: Indice non valido 3 per questa SqlParameterCollection con Count = 3

Quello che segue è la pseudo-codice:

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

Quando eseguo questo sto diventando la seguente eccezione:

indice non valido 3 per questa SqlParameterCollection con Count = 3

Please help me per risolvere questo problema.

+0

molto probabilmente perché la colonna "BillNo" è mappato per due volte, si tenta di aggiungere 2 parametro per la colonna 1, da qui l'errore outOfRange – Firo

risposta

14

molto probabilmente perché la colonna "BillNo" è mappata due volte, prova ad aggiungere 2 parametri per 1 colonna, quindi l'errore outOfRange. spostare il riferimento nella compositekey

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

Ciao @Firo, grazie per il vostro aiuto. Questo mi ha aiutato a risolvere questo problema. – Nagesh

Problemi correlati