2009-04-28 12 views
0

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が設定されていないという全く異なるエラーが発生します。

+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はそれらと連携できません。 –

関連する問題