2012-04-19 31 views
3

Nhibernateクエリを実行するには、親クラスのApplicationIDプロパティにアクセスする必要があります。 NUnitでこのクエリのテストを実行すると、「BusinessObjects.IntegrationTests.CMSEligibilityInfoRepositoryTest.FetchListByApplicationIDTest:System.IndexOutOfRangeException:Count = 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が初期化されている明白な場所はありません。おそらく上記のソースがありませんか? –

答えて

9

この種類のエラーは、同じプロパティが2回バインドされているか、同じ名前の2つのプロパティがマップされていることから発生します。親オブジェクトを削除し、子クラスを基本クラスにして、BenefitOptionInfoオブジェクトがBenOpIDによってマップされた唯一のオブジェクトであることを確認しました。

関連する問題