Получение индекса было вне диапазона исключений с NHibernate - PullRequest
1 голос
/ 19 октября 2010

В настоящее время я создаю веб-приложение с MVC и NHibernate. Теперь, когда я хочу получить информацию из базы данных, я получаю, что индекс находится вне диапазона исключения.

Текущая ситуация выглядит следующим образом.

Я получил файлы сопоставления трех таблиц базы данных:
Таблица для хранения группы с отношением один ко многим с 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>  

Таблица для хранения подписчика с отношением «один ко многим» с группой подписчиков.

<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 () не является опцией. Поэтому, если у кого-то есть идеи, почему я получаю эту ошибку и как она работает правильно, поделитесь своими знаниями!

EDIT:

Ниже приведена трассировка стека:

 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)

Спасибо

Gerard

Ответы [ 2 ]

1 голос
/ 21 октября 2010

В одном из ваших отображений я вижу, что вы используете порядковый номер.Используется ли это для сортировки ваших подписчиков в определенной группе?Убедитесь, что оно имеет правильное значение и значения обновляются в базе данных правильным образом.Например, если у вас есть только 2 записи и ваш порядковый номер начинается с 10, вы, скорее всего, получите эту ошибку, потому что будет возвращен список с 9 пустыми (обнуляемыми) элементами.При выполнении условия where будет сгенерировано исключение.

edit : Просто интересно, почему вы хотите заказать подписчиков в группе чего-либо ... Если это действительно не нужно, вы можете попробовать использоватьмешок.Для этого не требуется наличие порядкового столбца

0 голосов
/ 20 октября 2010

linq-to-nhibernate должен преобразовать ваше выражение Linq в SQL.Имея это в виду,

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

выглядит проблематично.linq-to-nhibernate должен был бы иметь возможность генерировать sql, который преобразует Group.Id в строку и сравнивает его с другой строкой ... тогда как в вашем рабочем примере

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

linq-to-nhibernate только должен сгенерировать sql для сравнения двух направляющих.

On Публикация в блоге Ayende , говоря о linq-to-nhibernate. Золтан Хубай оставил комментарий, в котором он получал исключение, подобное вашему с кодом:

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

и ответ Айенде был:

`` Я не думаю, что мы поддерживаем "d.Name.ToLower (). StartsWith (" a ")" в данный момент. ''

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...