2

私はクラスを持っており、次のようなDepartmentEntity名前のプロパティが含まれていますCompany(CompanyEntity):

public class DepartmentEntity
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
    public virtual DepartmentEntity Parent { get; set; }
    public virtual CompanyEntity Company { get; set; }
}

public class CompanyEntity
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
}

DepartmentEntity.hbm.xml以下のように:

<?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
        <class name="HS.DepartmentEntity, HS" table="DepartmentInfo" lazy="true">
            <id name="ID">
                <generator class="identity" />
            </id>
            <property name="Name" not-null="true" />
            <many-to-one name="Parent" column="ParentID" class="HS.DepartmentEntity, HS" cascade="none" unique="true" not-found="ignore" lazy="no-proxy" />
            <many-to-one name="Company" column="CompanyID" class="HS.CompanyEntity, HS" cascade="none" unique="true" not-found="ignore" lazy="no-proxy" />
        </class>
    </hibernate-mapping>

CompanyEntity.hbm.xml以下のように:

<?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
        <class name="HS.CompanyEntity, HS" table="CompanyInfo" lazy="true">
            <id name="ID">
                <generator class="identity" />
            </id>
            <property name="Name" not-null="true" />
        </class>
    </hibernate-mapping>

私は以下のコードを試しました:

IList<DepartmentEntity> list; 
using(ISession session = GetSession()) 
{ 
    string hql = "FROM DepartmentEntity as dpe join fetch dpe.Company"; 
    list = session.CreateQuery(hql).List<DepartmentEntity>(); 
} 

セッションが閉じられた後、プロパティCompanyにアクセスできませんが、リスト メソッドが 1 つのレコードしか見つからない場合、プロパティCompanyにアクセスできます。理由はわかりません。

4

2 に答える 2

0

NHibernate はセッション オブジェクトを使用して、ナビゲーション プロパティを遅延読み込みします。最初にナビゲーション プロパティにアクセスすると、NHibernate はデータ ストアにアクセスし、セッションを使用してオブジェクトの値を取得します。セッションが閉じられている場合、プロパティにアクセスしようとすると、タイプ の例外がスローされますNHibernate.LazyInitializationException

Company プロパティへのアクセスが必要な間はセッションを開いたままにしておくか、アプリケーションの遅延ロード (パフォーマンスが低下する可能性があります) をオフにすることをお勧めします。

于 2013-03-03T21:35:26.123 に答える