В настоящее время я создаю веб-приложение с 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