2012-04-19 2 views
3

Мне нужен доступ к свойству ApplicationID родительского класса для запуска запроса Nhibernate. Выполнение теста для этого запроса в NUnit приводит к его сбою: «BusinessObjects.IntegrationTests.CMSEligibilityInfoRepositoryTest.FetchListByApplicationIDTest: System.IndexOutOfRangeException: неверный индекс 6 для этого SqlParameterCollection с Count = 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

Оказывается, такая ошибка возникает из-за того, что одно и то же свойство связывается дважды, или, скорее, сопоставляются два свойства с тем же именем. Мы удалили родительский объект (как он никогда не использовался) и сделали базовые классы детей и удостоверились, что объект BenefitOptionInfo был единственным, что отображается через BenOpID.

 Смежные вопросы

  • Нет связанных вопросов^_^