5

Tôi đã cố gắng nâng cấp một dự án bằng cách sử dụng nhibernate 1.2 và NHibernate 3.1 đến FNH 1.3 và NH 3.2, và tất cả dường như hoạt động ngoại trừ bây giờ Im nhận được một ngoại lệ a .List() lệnh.Chỉ số nằm ngoài ranh giới của mảng - NHibernate 3.2

Ngoại lệ kiểu & nhắn là ... NHibernate.Exceptions.GenericADOException Không thể thực hiện tìm [SQL: SQL không có sẵn] và ngoại lệ bên trong ... System.IndexOutOfRangeException Index lại vượt ra ngoài giới hạn của mảng.

Tôi đã lược tả truy vấn trong SQL Server và tôi nghĩ rằng đó là vấn đề với bộ nhớ cache AppFabric và NH 3.2 vì truy vấn được tạo bởi NH là tốt.

Không có nội dung nào trong mã đã thay đổi chỉ tham chiếu FNH và NH của tôi.

Dưới đây là câu hỏi của tôi trong C# ...

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

và dưới đây là hbm lập bản đồ được tạo ra bởi FNH mà has not thay đổi giữa các phiên bản ...

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

Trong 3.2 nguồn NH sự dòng sau là nơi ngoại lệ được ném ...

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

và ngăn xếp cuộc gọ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>() 

Vì vậy, mọi trợ giúp sẽ được đánh giá cao, nếu bạn muốn biết thêm thông tin, hãy cho tôi biết, cảm ơn.

+0

Bạn đang nói chuyện với AppFabric như thế nào? Bạn đang sử dụng nhà cung cấp Velocity từ NHContrib? – PhilPursglove

+0

Không, chúng tôi đang sử dụng việc sử dụng Microsoft.ApplicationServer.Caching lắp ráp. – electricsheep

+0

Tôi có thể (và có lẽ là) sai về điều này nhưng tôi không * nghĩ * Vấn đề của AppFabric ở đây. Hiểu biết của tôi là sử dụng AppFabric (hoặc bất kỳ bộ nhớ cache nào khác) với NHibernate làm bộ nhớ cache cấp thứ hai, bạn cần bao gồm hỗ trợ cho nó với một nhà cung cấp (một số chi tiết tại http://nhforge.org/doc/nh/en/ index.html # cache), nó không chỉ xảy ra tự động; do đó câu hỏi của tôi về nhà cung cấp. – PhilPursglove

Trả lời

4

Sau rễ xung quanh internet (aka google) hơn một chút thấy điều này ...

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

Hóa ra một lỗi được biết đến trong NH 3.2 nghĩ tôi sẽ gửi đây trong trường hợp ai gặp vấn đề này.

+0

cũng trong nhibernate 3.3.1.4000 – giammin

Các vấn đề liên quan