5

He intentado actualizar un proyecto usando fluentemente nhibernate 1.2 y NHibernate 3.1 a FNH 1.3 y NH 3.2, y parece que todo funciona, excepto que ahora recibo una excepción en un comando .List().El índice estaba fuera de los límites de la matriz - NHibernate 3.2

La excepción de tipo de mensaje son & ... NHibernate.Exceptions.GenericADOException No se puede realizar encontrar [SQL: SQL no disponible] y la excepción interna ... System.IndexOutOfRangeException Índice fuera de los límites de la matriz

Tengo un perfil de la consulta en SQL Server y creo que es un problema con el caché de AppFabric y NH 3.2 porque la consulta generada por NH está bien.

Nada en el código ha cambiado solo mis referencias FNH y NH.

A continuación es mi consulta en C# ...

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

y por debajo es el HBM cartografía generada por FNH, que ya no haya cambiado entre versiones ...

<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> 

En la fuente de 3.2 NH la siguiendo la línea es donde se produce la excepción ...

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

y la pila de llamadas ...

> 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>() 

Así que cualquier ayuda sería muy apreciada, si quieres más información, házmelo saber, gracias.

+0

¿Cómo estás hablando con AppFabric? ¿Estás usando el proveedor de Velocity de NHContrib? – PhilPursglove

+0

No, estamos usando el ensamblado Microsoft.ApplicationServer.Caching. – electricsheep

+0

Podría estar (y probablemente estoy) equivocado al respecto, pero no * creo que * AppFabric es el problema aquí. Tengo entendido que para usar AppFabric (o cualquier otro caché) con NHibernate como un caché de segundo nivel, debe incluir compatibilidad con un proveedor (algunos detalles en http://nhforge.org/doc/nh/en/ index.html # caches), no solo ocurre automáticamente; de ahí mi pregunta sobre el proveedor. – PhilPursglove

Respuesta

4

Después del enraizamiento alrededor del Internet (también conocido como Google) un poco más encontrado esto ...

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

Resulta que es un error conocido en NH 3.2 pensaron que iba a publicar aquí en caso de que alguien más está teniendo este problema.

+0

también en nhibernate 3.3.1.4000 – giammin

Cuestiones relacionadas