2011-11-09 17 views
6

3:NHibernate hata iletisi: geçersiz dizin 3 sayısı ile bu SqlParameterCollection için = Böyle bir test veritabanı tasarıma sahip

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

I çalıştırın: enter image description here

aşağıdaki yalancı kod Bu aşağıdaki özel durum alıyorum: Kont ile bu SqlParameterCollection için

Geçersiz indeks 3 = 3

beni bu sorunu çözmek için yardımcı olun. Sütun "BillNo" iki kez eşleştirilmiş çünkü

+0

büyük olasılıkla, bu 1 sütun için 2 parametre eklemeye çalışır compositekey, dolayısıyla outofrange hatası – Firo

cevap

14

büyük olasılıkla, bu 1 sütununda, dolayısıyla outofrange hata için 2 parametre eklemek çalışır. Sütun "BillNo" iki kez eşleştirilmiş çünkü

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

Merhaba @Firo, yardımınız için teşekkür içine referans taşıyın. Bu, bu sorunu çözmemde bana yardımcı oldu. – Nagesh