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가 구성되지 않는 것과 완전히 다른 오류가 발생합니다.
스택 추적이 실제로 도움이됩니다. – Rashack
제이미 이데스 (Jamie Ide)의 답변에 대한 의견을 읽으십시오 (어쨌든 잘못된 것 같습니다). 나는 당신이 실제로 달성하고자하는 것을 모른다. 하지만 NH는 세션에서 인스턴스를 분리하고 다시 연결할 수 있기 때문에 3 계층 아키텍처에서 잘 작동합니다. 매핑 인터페이스 또한 쉽게 이루어져야합니다. 왜 데이터 액세스 레이어에서 비즈니스 로직이 필요한지 이해하지 못합니다. –