2011-11-09 18 views
6

tengo un diseño de base de datos de prueba como esta: enter image description hereNHibernate mensaje de error: índice no válido 3 para este SqlParameterCollection con Count = 3

El siguiente es el pseudo-código:

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

Cuando funciono esto me estoy poniendo la siguiente excepción:

índice no es válido para este 3 SqlParameterCollection con Count = 3

Ayúdenme a resolver este problema.

+0

muy probablemente porque la columna "BillNo" se asigna dos veces, se trata de añadir 2 parámetro para la columna 1, por lo tanto, el error OutOfRange – Firo

Respuesta

14

muy probablemente porque la columna "BillNo" se asigna dos veces, intenta agregar 2 parámetros para 1 columna, de ahí el error outOfRange. mover la referencia en el compositekey

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

Hola @Firo, gracias por su ayuda. Esto me ha ayudado a resolver este problema. – Nagesh

Cuestiones relacionadas