簡體   English   中英

NHibernate獲取索引超出范圍異常

[英]Getting an index was out of range exception with NHibernate

我目前正在使用MVC和NHibernate構建一個Web應用程序。 現在,當我想從數據庫中獲取信息時,我得到了索引超出范圍的異常。

當前情況如下。

我得到了三個數據庫表的映射文件:
用於存儲與subscriberingroup具有一對多關系的組的表。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <joined-subclass name="CMS.Business.Entities.Subscriber, CMS.Business.Entities" extends="CMS.Business.Entities.BaseEntity, CMS.Business.Entities" table="CMS_Subscriber">
    <key column="Id" />
    <property name="Email" />
    <property name="FirstName" />
    <property name="Lastname" />
    <list name="SubscriberInGroup" cascade="all" table="CMS_SubscriberInGroup">
      <key column="SubscriberId" />
      <index column="Ordinal" />
      <one-to-many class="CMS.Business.Entities.SubscriberInGroup, CMS.Business.Entities" />
    </list>
  </joined-subclass>
</hibernate-mapping>  

一個表,用於存儲與subscriberingroup具有一對多關系的訂戶。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <joined-subclass name="CMS.Business.Entities.Group, CMS.Business.Entities" extends="CMS.Business.Entities.BaseEntity, CMS.Business.Entities" table="CMS_Group">
    <key column="Id" />
    <property name="Name" />
    <list name="SubscriberInGroup" cascade="all" lazy="false" table="CMS_SubscriberInGroup">
      <key column="GroupId" />
      <index column="Ordinal" />
      <one-to-many class="CMS.Business.Entities.SubscriberInGroup, CMS.Business.Entities" />
    </list>
  </joined-subclass>
</hibernate-mapping>   

最后是訂戶組映射

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <joined-subclass name="CMS.Business.Entities.SubscriberInGroup, CMS.Business.Entities" extends="CMS.Business.Entities.BaseEntity, CMS.Business.Entities" table="CMS_SubscriberInGroup">
        <key column="Id" />
        <property name="ConfirmationDate" />
        <property name="ConfirmationIP" />
        <property name="SubscribeDate" />
        <property name="SubscribeIP" />
        <property name="SubscribeLocation" />
        <property name="UnSubscribeDate" />
        <property name="UnSubscribeIP" />
        <property name="UnSubscribeLocation" />
        <many-to-one name="Subscriber" class="CMS.Business.Entities.Subscriber, CMS.Business.Entities" column="SubscriberId" />
        <many-to-one name="Group" class="CMS.Business.Entities.Group, CMS.Business.Entities" column="GroupId" />
    </joined-subclass>
</hibernate-mapping>

在訂戶類中,對於一對多關系,我具有以下屬性:

/// <summary>
        /// The subscriberingroup where the subscriber is registered.
        /// </summary>
        [List(4, Name = "SubscriberInGroup", Cascade = CascadeStyle.All)]
        [NHibernate.Mapping.Attributes.Key(5, Column = "SubscriberId")]
        [Index(6, Column = "Ordinal")]
        [OneToMany(7, ClassType = typeof(SubscriberInGroup))]
        public virtual IList<SubscriberInGroup> SubscriberInGroup { get; set; }

在組類中,我具有一對一關系的以下屬性:

/// <summary>
        /// The subscribers of this group.
        /// </summary>
        [List(4, Name = "SubscriberInGroup", Cascade = CascadeStyle.All)]
        [Key(5, Column = "GroupId")]
        [Index(6, Column = "Ordinal")]
        [OneToMany(7, ClassType = typeof(SubscriberInGroup))]
        public virtual IList<SubscriberInGroup> SubscriberInGroup { get; set; }

在SubscriberInGroup類中,對於多對一關系,我具有以下內容:

/// <summary>
        /// The subscriber.
        /// </summary>
        [ManyToOne(8, ClassType = typeof(Subscriber), Column="SubscriberId", ForeignKey = "FK_Subscriber_SubscriberInGroup")]
        public virtual Subscriber Subscriber { get; set; }
        /// <summary>
        /// The group which is subscribed to.
        /// </summary>
        [ManyToOne(9, ClassType = typeof(Group), Column = "GroupId", ForeignKey = "FK_Group_SubscriberInGroup")]
        public virtual Group Group { get; set; }

當我想在組和訂戶表中獲取帶有某些值的SubscriberInGroup時,我得到了索引超出范圍的異常。

以下查詢會發生這種情況:

SubscriberService.GetSubscriberInGroup(viewModel.EmailAddress, new Guid(s));
                    SubscriberService.GetSubcribersInGroup().Where(
                        g => g.Subscriber.Email == viewModel.EmailAddress && g.Group.Id.ToString().Equals(s1)).
                        FirstOrDefault();

執行此查詢時,出現異常。 奇怪的是,當我這樣做時:

var list = SubscriberService.GetSubcribersInGroup().ToList();
                var subscriberInGroup =
                    list.FirstOrDefault(
                        g => g.Subscriber.Email.Equals(viewModel.EmailAddress) && g.Group.Id == new Guid(s1));

它也像我預期的那樣工作。 GetSubscriberInGroup方法如下所示:

公共IQueryable GetSubcribersInGroup(){return _session.Linq(); }

我希望它像第一種方法那樣工作,因為表可以包含許多條目,並且ToList()不是一個選項。 因此,如果有人對我為什么會收到此錯誤以及如何使其正常工作有任何想法,請分享您的知識!

編輯:

下面是堆棧跟蹤:

 at System.SZArrayHelper.get_Item[T](Int32 index)
   at NHibernate.Linq.Visitors.EntityExpressionVisitor.VisitMethodCall(MethodCallExpression expr)
   at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp)
   at NHibernate.Linq.Visitors.EntityExpressionVisitor.FindEntity(Expression expr, Boolean findFirst)
   at NHibernate.Linq.Visitors.BinaryCriterionVisitor.VisitMethodCall(MethodCallExpression expr)
   at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp)
   at NHibernate.Linq.Visitors.BinaryCriterionVisitor.GetBinaryCriteria(ICriteria rootCriteria, ISession session, BinaryExpression expr, ComparePropToValue comparePropToValue, ComparePropToProp comparePropToProp, CompareValueToCriteria compareValueToCriteria, ComparePropToCriteria comparePropToCriteria)
   at NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitBinaryCriterionExpression(BinaryExpression expr)
   at NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitBinary(BinaryExpression expr)
   at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp)

謝謝,

傑拉德

在您的一個映射中,我看到您正在使用序數。 這是用於將您的用戶分類在特定組中嗎? 確保它具有正確的值,並且值已在數據庫中以正確的方式更新。 例如,如果您只有2條記錄,並且序數從10開始,則很可能會遇到此錯誤,因為將返回包含9個空(可空)項的列表。 當執行where條件時,將引發異常。

編輯 :只是想知道為什么要訂購一組的訂戶..如果不是真的必要,則可以嘗試使用手提袋。 這不需要序數列

linq-to-nhibernate必須將您的Linq表達式轉換為SQL。 考慮到這一點

g.Group.Id.ToString().Equals(s1)

看起來有問題。 linq-to-hhibernate必須具有生成將Group.Id轉換為String並將其與另一個String進行比較的sql的能力...而在您的工作示例中

g.Group.Id == new Guid(s1)

linq-to-hhibernate只需要生成sql來比較兩個向導。

Ayende的博客文章中,談到了從linq轉變為休眠狀態的Zoltan Hubai,他發表了一條評論,其中他使用代碼獲得了與您類似的異常:

where d.Name.ToLower().StartsWith("a") 

Ayende的回應是:

“我認為目前我們不支持“ d.Name.ToLower()。StartsWith(” a“)”。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM