3

Castle ActiveRecord を使用して Web アプリを作成していますが、遅延ロードされた関連オブジェクトのリストにアクセスしようとすると、常にこの例外が発生します。これが私のコードです:

        using(new SessionScope())
        {
            foreach (var field in eventObj.RegistrationFields)
            {
                //Do something with the field here...
            }
        }

RegistrationFields プロパティは次のようになります。

    [HasMany(Inverse = true, Lazy = true)]
    public IList<EventRegistrationField> RegistrationFields { get; set; }

foreach ループで「eventObj.RegistrationFields」にアクセスすると、例外が発生します。また、activeRecord 構成設定で isweb="true" 属性を設定するようにしました。なぜこれが起こるのか誰にも分かりますか?これが私の設定です:

<connectionStrings>
  <add name="main" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=EventScheduler;Integrated Security=SSPI"/>
</connectionStrings>
<activerecord isWeb="true">
  <config>
    <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
    <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect"/>
    <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
    <add key="hibernate.connection.connection_string_name" value="main"/>
  </config>
</activerecord>
4

2 に答える 2

6

セッションについて混乱していると思います。RegistrationFieldsの遅延プロパティですeventObjeventObj読み込みを担当するのは、読み込まれたセッションですRegistrationFields。を使用して新しいセッションを明示的に開いています。これにより、バインドさnew SessionScope()れていない新しいセッションが作成されます。eventObjしたがって、データを取得するための所有セッションはありません。元のセッションがまだ生きている場合でも、呼び出すと新しいセッションがネストされ、現在のスコープで が呼び出されるnew SessionScope()まで表示されない古いセッションが非表示になります。Dispose()オブジェクトが現在のセッションに自動的にアタッチされることはありません。これは予想される NHibernate の動作です。

作業単位ごとのセッションを実行しようとしているように見えますが、これは問題ありませんが、オブジェクトの読み込みとそれらすべてのオブジェクトの遅延コレクションの解決は、その作業単位内で発生する必要があります。

session-per-request に移行して (これを実現する方法については、Castle のドキュメントを参照してください)、SessionScope の作成を削除してみてください。これにより、ページ リクエストの間、オブジェクトが存続します (これは、遅延コレクションが Web アプリ内に存在する必要がある限りです)。ただし、このシナリオでは、永続オブジェクトに加えた変更はすべて、セッションのフラッシュ時に DB に書き込まれることに注意する必要があります (実際には、永続オブジェクトの状態の変更は、基になるオブジェクトの変更として扱う必要があります)。あたかも同じ操作であるかのようにデータを処理します。

于 2008-12-22T12:09:20.223 に答える
1

eventObjはいつロードされましたか?それもセッションに含まれている必要があります。また、ドキュメントのActiveRecord統合セクションを確認してください。

于 2008-12-19T20:14:49.137 に答える