2012-04-19 72 views
3

我需要訪問父類的ApplicationID屬性才能運行Nhibernate查詢。運行測試此查詢中的NUnit導致它失敗,因爲這樣的:「BusinessObjects.IntegrationTests.CMSEligibilityInfoRepositoryTest.FetchListByApplicationIDTest:System.IndexOutOfRangeException:無效索引6此SqlParameterCollection與計數= 6」。此SqlParameterCollection的索引無效,計數爲

這個代碼集合在嘗試獲取ApplicationID之前工作正常。

到目前爲止我所做的最好的研究是它是一個映射問題。

父類:

public abstract class MemberEligibilityInfo 
{ 
    #region Access Properties 

    private int _managedBenOpID; 
    private int _managedApplicationID; 

    /// <summary> 
    /// ID 
    /// </summary> 
    public virtual uint ID { get; set; } 

    /// <summary> 
    /// MemberElig ID that will work with NHibernate 
    /// </summary> 
    public virtual int ManagedMemberEligID { get; set; } 

    /// <summary> 
    /// Member ID 
    /// </summary> 
    public virtual ulong MemberID { get; set; } 

    /// <summary> 
    /// Member ID that will work with NHibernate 
    /// </summary> 
    public virtual long ManagedMemberID { get; set; } 

    /// <summary> 
    /// Benefit Option ID 
    /// </summary> 
    public virtual uint BenefitOptionID { get; set; } 

    public virtual int ManagedBenOpID 
    { 
     get { return _managedBenOpID; } 
     set 
     { 
      if (_managedBenOpID == value) 
      { 
       BenefitOptionID = (uint)_managedBenOpID; 
       return; 
      } 

      _managedBenOpID = value; 
      BenefitOptionID = (uint)_managedBenOpID; 
     } 
    } 

    /// <summary> 
    /// Benefit Option 
    /// </summary> 
    public virtual string UBOI { get; set; } 

    /// <summary> 
    /// Application ID 
    /// </summary> 
    public virtual uint ApplicationID { get; set; } 

    public virtual int ManagedApplicationID 
    { 
     get { return _managedApplicationID; } 

     set 
     { 
      if (_managedApplicationID == value) 
      { 
       ApplicationID = (uint)_managedApplicationID; 
       return; 
      } 

      _managedApplicationID = value; 
      ApplicationID = (uint)_managedApplicationID; 
     } 
    } 
    /// <summary> 
    /// Application Plan Year date. 
    /// </summary> 
    public virtual DateTime ApplicationPlanYear { get; set; } 

    /// <summary> 
    /// Effective Date. 
    /// </summary> 
    public virtual DateTime EffectiveDate { get; set; } 

    /// <summary> 
    /// Termination Date. 
    /// </summary> 
    public virtual DateTime TermDate { get; set; } 

    #endregion // Access Properties 

    #region Constructors 

    /// <summary> 
    /// Default constructor. 
    /// </summary> 
    public MemberEligibilityInfo() 
    { 
     ID = 0; 
     MemberID = 0; 
     BenefitOptionID = 0; 
     UBOI = string.Empty; 
     ApplicationID = 0; 
     ApplicationPlanYear = DateTime.MinValue; 
     EffectiveDate = DateTime.MinValue; 
     TermDate = DateTime.MinValue; 
    } 

    #endregion // Constructors 
} 

兒童類:

public class CMSEligibilityInfo : MemberEligibilityInfo 
{ 
    private BenefitOptionInfo _managedBenefitOptionInfo; 

    #region Access Properties 

    /// <summary> 
    /// Precedence 
    /// </summary> 
    public virtual int Precedence { get; set; } 

    /// <summary> 
    /// Is Active 
    /// </summary> 
    public virtual bool Active { get; set; } 


    public virtual BenefitOptionInfo ManagedBenefitOptionInfo 
    { 
     get { return _managedBenefitOptionInfo; } 
     set 
     { 
      if (_managedBenefitOptionInfo == value) 
      { 
       return; 
      } 

      _managedBenefitOptionInfo = value; 
      this.ManagedApplicationID = ManagedBenefitOptionInfo.ManagedApplicationID; 
     } 
    } 

    public virtual MemberInfo MemberInfo 
    { 
     get; 
     set; 
    } 

    #endregion // Access Properties 

    #region Constructors 

    /// <summary> 
    /// Default Constructor 
    /// </summary> 
    public CMSEligibilityInfo() : base() 
    { 
     Precedence = 0; 
     Active = false; 
    } 

    #endregion // Constructors 
} 

兒童類映射:

public class CMSEligibilityInfoMap : ClassMap<CMSEligibilityInfo> 
{ 
    public CMSEligibilityInfoMap() 
    { 
     // Table 
     Table("_MEI_EligPeriods"); 

     // Unique Identifier 
     Id(x => x.ManagedMemberEligID, "MemEligID") 
      .GeneratedBy.Identity(); 

     // Member ID, Managed to handle the bigint 
     Map(x => x.ManagedMemberID, "MemberID") 
      .Not.Nullable(); 

     // Benefit Option ID 
     Map(x => x.ManagedBenOpID, "BenOpID") 
      .Not.Nullable(); 

     //// Effective Date 
     Map(x => x.EffectiveDate, "Eff") 
      .Nullable(); 

     // Termination Date 
     Map(x => x.TermDate, "Term") 
      .Nullable(); 

     // Is the eligibility record active 
     Map(x => x.Active, "Active") 
      .Not.Nullable(); 

     Map(x => x.Precedence, "Precedence") 
      .Nullable(); 

     References(x => x.ManagedBenefitOptionInfo) 
      .Column("BenOpID") 
      .Not.LazyLoad() 
      .Cascade.None(); 

     // References back to MemberInfo 
     References(x => x.MemberInfo) 
      .Column("MemberID") 
      .Not.LazyLoad() 
      .Cascade.None(); 
    } 
} 

查詢在儲存庫中的方法,導致該錯誤:

/// <summary> 
    /// Fetch a list of eligibility info based on Application ID 
    /// </summary> 
    /// <param name="appID">Selected Application ID</param> 
    /// <returns>A list of eligibility information</returns> 
    public IList<CMSEligibilityInfo> FetchListByApplicationID(uint? appID) 
    { 
     using (var session = SessionFactory.OpenSession()) 
     using (var transaction = session.BeginTransaction()) 
     { 
      var list = session.CreateCriteria<CMSEligibilityInfo>() 
       .CreateAlias("ManagedBenefitOptionInfo", "ManagedBenefitOptionInfo")     .Add(Restrictions.Eq(Projections.Property("ManagedBenefitOptionInfo.ManagedApplicationID"), appID)) 
       .List<CMSEligibilityInfo>(); 

      // Commit the transaction 
      transaction.Commit(); 

      return list; 
     } 
    } 
+0

我沒有看到你使用ApplicationID來檢索任何東西。並沒有明顯的地方,SqlParameterCollection被初始化,你是否可能錯過了上面的一些來源? – 2012-04-19 20:34:12

回答

9

原來,約束這種來自同一性質的錯誤結果的兩倍,或者說,具有相同名稱的兩個屬性被映射。我們刪除了父對象(因爲它是從來沒有使用過),並讓孩子們的基類,並確保了BenefitOptionInfo目的是通過BenOpID映射的唯一的事情。

相關問題