2009-04-28 6 views
0

nHibernate에서 세션 팩토리를 인스턴스화하려고 할 때마다 매개 변수 인덱스에 "ArgumentOutOfRangeException"이 표시됩니다. 이 오류는 nHibernate의 내부 깊은 곳에서 발생합니다. 그게 도움이된다면 오류 스택 추적을 게시 할 수 있습니다.nHibernate에서 SessionFactory를 빌드하는 중 오류가 발생했습니다.

이것은 매우 단순한 3 단계 아키텍처의 새로운 프로젝트입니다. 데이터 레이어는 nHibernate 클래스를 비즈니스 레이어에 의해 구현되는 간단한 인터페이스로 매핑합니다. 현재 nHibernate에 의해 사용되는 하나의 인터페이스 세트와 매핑 파일이있다. 다행히도 내 문제는 쉽게 찾아 낼 수 있습니다.

여기는 sessionFactory를 빌드하는 함수입니다.

Private Shared Function SessionFactory() As ISessionFactory 
     If _sessionFactory Is Nothing Then 
      Dim config As New NHibernate.Cfg.Configuration 
      config.Configure() 
      config.AddClass(GetType(ICompanyProperty)) 
      _sessionFactory = config.BuildSessionFactory    
     End If 
     Return _sessionFactory 
    End Function 

은 여기 내 hibernate.cfg.xml로

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
    <property name="connection.provider"> 
     NHibernate.Connection.DriverConnectionProvider  
    </property> 
    <property name="dialect"> 
     NHibernate.Dialect.MsSql2005Dialect 
    </property> 
    <property name="connection.driver_class"> 
     NHibernate.Driver.SqlClientDriver 
    </property> 
    <property name="connection.connection_string"> 
     Data Source=dataserver.domain.ad;Initial Catalog=LABs;Integrated Security=SSPI 
    </property> 
    </session-factory> 
</hibernate-configuration> 

내가 매핑 오전 인터페이스의 매핑 파일입니다.

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Sample.Data" namespace="Sample.Data"> 
    <class name="ICompanyProperty" table="CompanyProperty"> 
    <id name="CompanyPropertyID" column="CompanyPropertyID"> 
     <generator class="native" /> 
    </id>  
    <discriminator column="PropertyType" type="String" /> 
    <property name="CompanyID" /> 
    <property name="PropertyName" />  
    <subclass discriminator-value="SQL" name="ISQLLookupCompanyProperty"> 
     <property name="TableName" />  
     <property name="KeyField" /> 
     <property name="ValueField" /> 
     <property name="ConnectionString" /> 
    </subclass> 
    <subclass discriminator-value="LIST" name="ILookupCompanyProperty" />  
    </class> 
</hibernate-mapping> 

그리고 인터페이스

Public Interface ICompanyProperty 
    Property CompanyPropertyID() As Integer 
    Property PropertyName() As String 
    Property CompanyID() As Integer 
    Property PropertyType() As String 
End Interface 

Public Interface ILookupCompanyProperty 
    Inherits ICompanyProperty 
End Interface 

Public Interface ISQLLookupCompanyProperty 
    Inherits ILookupCompanyProperty 

    Property TableName() As String 
    Property KeyField() As String 
    Property ValueField() As String 
    Property ConnectionString() As String 
End Interface 

감사합니다!

편집 : 스택 추적을 요청했습니다. 여기에 오류가 세션 팩토리 빌드의 내 전화에서입니다.

at System.Collections.ArrayList.get_Item(Int32 index) 
at NHibernate.SqlCommand.InFragment.ToFragmentString() 
at NHibernate.Persister.Entity.SingleTableEntityPersister.DiscriminatorFilterFragment(String alias) 
at NHibernate.Persister.Entity.SingleTableEntityPersister.FilterFragment(String alias) 
at NHibernate.Persister.Entity.AbstractEntityPersister.FilterFragment(String alias, IDictionary`2 enabledFilters) 
at NHibernate.Loader.Entity.EntityJoinWalker..ctor(IOuterJoinLoadable persister, String[] uniqueKey, Int32 batchSize, LockMode lockMode, ISessionFactoryImplementor factory, IDictionary`2 enabledFilters) 
at NHibernate.Loader.Entity.EntityLoader..ctor(IOuterJoinLoadable persister, String[] uniqueKey, IType uniqueKeyType, Int32 batchSize, LockMode lockMode, ISessionFactoryImplementor factory, IDictionary`2 enabledFilters) 
at NHibernate.Loader.Entity.EntityLoader..ctor(IOuterJoinLoadable persister, Int32 batchSize, LockMode lockMode, ISessionFactoryImplementor factory, IDictionary`2 enabledFilters) 
at NHibernate.Loader.Entity.EntityLoader..ctor(IOuterJoinLoadable persister, LockMode lockMode, ISessionFactoryImplementor factory, IDictionary`2 enabledFilters) 
at NHibernate.Loader.Entity.BatchingEntityLoader.CreateBatchingEntityLoader(IOuterJoinLoadable persister, Int32 maxBatchSize, LockMode lockMode, ISessionFactoryImplementor factory, IDictionary`2 enabledFilters) 
at NHibernate.Persister.Entity.AbstractEntityPersister.CreateEntityLoader(LockMode lockMode, IDictionary`2 enabledFilters) 
at NHibernate.Persister.Entity.AbstractEntityPersister.CreateEntityLoader(LockMode lockMode) 
at NHibernate.Persister.Entity.AbstractEntityPersister.CreateLoaders() 
at NHibernate.Persister.Entity.AbstractEntityPersister.PostInstantiate() 
at NHibernate.Persister.Entity.SingleTableEntityPersister.PostInstantiate() 
at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners) 
at NHibernate.Cfg.Configuration.BuildSessionFactory() 

편집 2 : 내가 판별자를 제거하면 더 이상이 오류가 발생하지 않습니다. 나는 그렇게하지 않습니까?

편집 3 : nHibernate에 대한 소스 코드를 다운로드 할 때, 디버그 출력에 대한 링크를 직접 만들고 빌드를 실행하면 ProxyFactoryFactory가 구성되지 않는 것과 완전히 다른 오류가 발생합니다.

+0

스택 추적이 실제로 도움이됩니다. – Rashack

+0

제이미 이데스 (Jamie Ide)의 답변에 대한 의견을 읽으십시오 (어쨌든 잘못된 것 같습니다). 나는 당신이 실제로 달성하고자하는 것을 모른다. 하지만 NH는 세션에서 인스턴스를 분리하고 다시 연결할 수 있기 때문에 3 계층 아키텍처에서 잘 작동합니다. 매핑 인터페이스 또한 쉽게 이루어져야합니다. 왜 데이터 액세스 레이어에서 비즈니스 로직이 필요한지 이해하지 못합니다. –

답변

1

당신은 NHibernate에게 어떤 구체적인 클래스를 사용할 것인지 알려줄 필요가 있다고 생각합니다. 인터페이스를 사용하여, 당신은 중첩 서브 클래스 매핑이 필요하다는하려면 :

<subclass discriminator-value="SQL" name="ISQLLookupCompanyProperty"> 
    <subclass discriminator-value="SQL" name="SQLLookupCompanyProperty> 
     <property name="TableName" />  
     <property name="KeyField" /> 
     <property name="ValueField" /> 
     <property name="ConnectionString" /> 
    </subclass> 
</subclass> 
<subclass discriminator-value="LIST" name="ILookupCompanyProperty"> 
    <subclass discriminator-value="LIST" name="LookupCompanyProperty" /> 
</subclass> 

나는 blog entry에서이 솔루션을 발견했다.

+0

제 경우 ISqlLookupCompanyProperty 및 SqlLookupCompanyProperty는 실제로 Sample.Data 및 Sample.Core의 다른 어셈블리에 있습니다. nHibernate가 인터페이스를 채우는 것에 대해 걱정할 필요가있는 모든 것들은 그 인터페이스를 구현하는 모든 클래스를 정말로 알아야합니까? –

+0

AFAIK, 매핑 된 모든 클래스에 대해 알아야합니다. 어떤 반원이 돌아올 것으로 기대하십니까? 인터페이스를 반환 할 수 없으며 인터페이스로 선언 된 클래스 만 반환 할 수 있습니다. –

+0

Sample.Core의 클래스에서 Sample.Data에 선언 된 인터페이스를 구현합니다. nHibernate를 가진 진정한 3 티어 시스템을 얻는 것이 불가능한 것처럼 보입니다. 데이터 레이어에서 비즈니스 로직 객체의 일부를 선언해야하거나 nHibernate가 그것들과 함께 작업 할 수 없습니다. –

관련 문제