nHibernateでセッションファクトリをインスタンス化しようとすると、パラメータインデックスに "ArgumentOutOfRangeException"が表示されます。このエラーは、nHibernateの腸の深部にあるプロシージャから発生します。エラーのスタックトレースを投稿できます。nHibernateでSessionFactoryを構築する際にエラーが発生しました
これは非常にシンプルな3層アーキテクチャの新プロジェクトです。データレイヤーは、nHibernateクラスをビジネスレイヤーによって実装される単純なインターフェースにマップします。現在、nHibernateで使用されているインターフェイスセットとマッピングファイルは1つだけです。うまくいけば私の問題は見つけやすい。
ここに私が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()
Edit2:ディスクリミネータを削除すると、このエラーは発生しなくなりました。私はそうしていませんか?
編集3:nHibernateのソースコードをダウンロードすると、自分でビルドしてデバッグ出力にリンクして実行すると、ProxyFactoryFactoryが設定されていないという全く異なるエラーが発生します。
スタックトレースが本当に役に立ちます。 – Rashack
Jamie Ideの答えに関するコメントを読んでください(とにかく間違っていると思います)。私はあなたが実際に達成しようとしていることを知らない。しかし、NHはセッションからインスタンスを切り離して再接続することができるため、3層アーキテクチャーでうまく機能します。マッピングインターフェイスも簡単にする必要があります。なぜデータアクセスレイヤーにビジネスロジックが必要なのか理解できない –