Индекс находился за пределами массива - NHibernate 3.2 - PullRequest
6 голосов
/ 19 января 2012

Я пытался обновить проект с использованием свободно используемых nhibernate 1.2 и NHibernate 3.1 до FNH 1.3 и NH 3.2, и все это, кажется, работает, за исключением того, что теперь я получаю исключение по команде .List ().

Тип исключения и сообщение: ... NHibernate.Exceptions.GenericADOException Невозможно выполнить поиск [SQL: SQL недоступен], а внутреннее исключение ... System.IndexOutOfRangeException Индекс находился за пределами массива.

Я профилировал запрос в SQL Server и считаю, что это проблема с кешем AppFabric и NH 3.2, потому что запрос, сгенерированный NH, в порядке.

Ничто в коде не изменило только мои ссылки на FNH и NH.

Ниже приведен мой запрос на C # ...

return ResourceRepository.Query()
                        .LeftOuterJoin(r => r.ResourceCorpus, () => resourceCorpusAlias)
                        .LeftOuterJoin(r => r.ResourceType, () => resourceTypeAlias)
                        .Cachable()
                        .List();

, а ниже - отображение hbm, сгенерированное FNH, которое не изменилось между версиями ...

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false">
  <class xmlns="urn:nhibernate-mapping-2.2" schema="[Reference]" mutable="false" name="MyAssembly.Reference.Resource, MyAssembly.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Resource`">
    <cache usage="read-only" />
    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
      <column name="Id" />
      <generator class="assigned" />
    </id>
    <bag name="ResourceCorpus" mutable="false">
      <cache usage="read-only" />
      <key>
        <column name="ResourceId" />
      </key>
      <one-to-many class="MyAssembly.Reference.ResourceCorpus, MyAssembly.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </bag>
    <property name="TokenName" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="TokenName" />
    </property>
    <property name="Description" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Description" />
    </property>
    <many-to-one class="MyAssembly.Reference.ResourceType, MyAssembly.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" fetch="select" name="ResourceType">
      <column name="ResourceTypeId" />
    </many-to-one>
  </class>
</hibernate-mapping>

В источнике NH 3.2 в следующей строке выдается исключение ...

if (nonCacheable != null && nonCacheable[i])

и стек вызовов ...

>   NHibernate.dll!NHibernate.Type.TypeHelper.Disassemble(object[] row, NHibernate.Type.ICacheAssembler[] types, bool[] nonCacheable, NHibernate.Engine.ISessionImplementor session, object owner)
    NHibernate.dll!NHibernate.Cache.StandardQueryCache.Put(NHibernate.Cache.QueryKey key, NHibernate.Type.ICacheAssembler[] returnTypes, System.Collections.IList result, bool isNaturalKeyLookup, NHibernate.Engine.ISessionImplementor session)
    NHibernate.dll!NHibernate.Loader.Loader.PutResultInQueryCache(NHibernate.Engine.ISessionImplementor session, NHibernate.Engine.QueryParameters queryParameters, NHibernate.Type.IType[] resultTypes, NHibernate.Cache.IQueryCache queryCache, NHibernate.Cache.QueryKey key, System.Collections.IList result)
    NHibernate.dll!NHibernate.Loader.Loader.ListUsingQueryCache(NHibernate.Engine.ISessionImplementor session, NHibernate.Engine.QueryParameters queryParameters, Iesi.Collections.Generic.ISet<string> querySpaces, NHibernate.Type.IType[] resultTypes)
    NHibernate.dll!NHibernate.Loader.Criteria.CriteriaLoader.List(NHibernate.Engine.ISessionImplementor session)
    NHibernate.dll!NHibernate.Impl.SessionImpl.List(NHibernate.Impl.CriteriaImpl criteria, System.Collections.IList results)
    NHibernate.dll!NHibernate.Impl.CriteriaImpl.List(System.Collections.IList results)
    NHibernate.dll!NHibernate.Impl.CriteriaImpl.List<MyAssembly.Reference.Resource>()

Так что любая помощь будет очень полезнаЕсли вам нужна дополнительная информация, дайте мне знать, спасибо.

1 Ответ

4 голосов
/ 20 января 2012

После рутинга в интернете (он же гугл) еще немного нашел вот это ...

https://nhibernate.jira.com/browse/NH-2961

Оказывается, это известная ошибка в NH 3.2, которую я хотел бы опубликовать здесь вна случай, если у кого-то еще есть эта проблема.

...