0

MVC2、NHibernate 3.2 を使用しています。

私のクラス:

public class NHibernateHelper
{

    private static ISessionFactory _sessionFactory;

    private static ISessionFactory SessionFactory
    {
        get
        {
            if (_sessionFactory == null)
            {
                var configuration = new Configuration();
                configuration.Configure();
                configuration.AddAssembly(typeof(EstoqueEquipamento).Assembly);
                _sessionFactory = configuration.BuildSessionFactory();
            }
            return _sessionFactory;
        }
    }

    public static ISession OpenSession()
    {
        return SessionFactory.OpenSession();
    }
}

私はこれで要素を照会します:

 public Car GetCar(object pk)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            {

                return session.Get<Car>(pk);
            }
        }

車のマッピング:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateClasses" namespace="NHibernateClasses.Entities">
    <class name="Car" table="STACK.CAR" lazy="true" dynamic-update="true" dynamic-insert="true" >
        <id name="CarId" column="CAR_ID" type="Int32" unsaved-value="0">
            <generator class="sequence">
                <param name="sequence">SQ_CAR</param>
            </generator>
        </id>
        <bag name="TireList" inverse="true" generic="true" lazy="true" >
            <key>
                <column name="CarId"/>
            </key>
            <one-to-many class="Tire" />
        </bag>




        <property name="Plate" type="String" column="MAH_PLATE" />



    </class>
</hibernate-mapping>

タイヤのマッピング:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateClasses" namespace="NHibernateClasses.Entities">
    <class name="Tire" table="STACK.Tire" lazy="true" dynamic-update="true" dynamic-insert="true" >
        <id name="TireId" column="Tire_ID" type="Int32" unsaved-value="0">
            <generator class="sequence">
                <param name="sequence">SQ_Tire</param>
            </generator>
        </id>


        <property name="Brand" type="String" column="MAH_BRAND" />



    </class>
</hibernate-mapping>

次に、要素をクエリします。

var car = GetCar(1);//works just fine
var tirelist = car.Tires;//throws error!

最初の行は問題なく動作しますが、最後の行で次のエラーがスローされます。

[Car] の初期化 - ロールのコレクションの遅延初期化に失敗しました: Car.TireList、セッションまたはセッションが閉じられませんでした

設定ファイルも必要な場合はお知らせください。

ありがとうございました

4

1 に答える 1

3

GetCarusingでは、コードの後半でTires-collectionにアクセスする前に、(のために)セッションを閉じます。コレクションはデフォルトでnHibernateに遅延ロードされるため、トランザクションを終了する前にコレクションをフェッチするようにしてください。Eagerローディングを使用して、nHibernateが子コレクションもロードするようにすることができます。

于 2011-11-08T11:26:42.807 に答える