2011-08-16 29 views
1

我的映射員工和項目有問題:例如,在員工映射中,我有「包」來映射其他表。問題是,當我打開員工窗口時,這需要花費很多時間(10秒)打開窗口,我怎樣才能使繪圖更好,更快?也許在懶惰或在獲取?如何使映射提高應用程序的速度?

這是員工的映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="AdminProject" 
        namespace="AdminProject.Business.Entity"> 
    <class name="Employee"> 

    <id name="EmployeeId" type="int">  
    </id> 

    <property name="OperatorNum" 
     generated="always" 
     update="false" 
     insert="false" 
     type="int"/> 
    <property name="Password" type="string"/> 
    <property name="Name" type="string"/> 
    <property name="LastName" type="string"/> 
    <property name="DateBegin" type="DateTime"/> 
    <property name="DateEnd" type="DateTime"/> 
    <property name="Telephone" type="string"/> 
    <property name="Address" type="string"/> 

    <many-to-one 
     name="EmployeeState" 
     column="EmployeeStateId" 
     class="EmployeeState" 
     fetch="join"/> 

    <bag name="EmployeebyProject" lazy="false"> 
     <key column="EmployeeId"/> 
     <one-to-many class="EmployeebyProject"/> 
    </bag> 

    <bag name="EmployeeComments" lazy="false"> 
     <key column="EmployeeId"/> 
     <one-to-many class="EmployeeComments"/> 
    </bag> 

    </class> 

</hibernate-mapping> 

謝謝..

回答

1

您應該使用SQL Server Profiler要弄清楚什麼是被從數據庫加載。或者你可以設置NHibernate來記錄SQL。通過這種方式,您可以更輕鬆地查看導致延遲的原因。很可能是由於熱切地加載集合引起的(您的映射有lazy="false")。如果是這種情況,您可以簡單地將其設置爲true(默認)。

<bag name="EmployeebyProject" lazy="true"> 
    <key column="EmployeeId"/> 
    <one-to-many class="EmployeebyProject"/> 
</bag> 

<bag name="EmployeeComments" lazy="true"> 
    <key column="EmployeeId"/> 
    <one-to-many class="EmployeeComments"/> 
</bag> 

您的多對一關聯也熱切地加載(fetch="join")。

其中一種流行的方法是使所有關聯都是懶惰的(懶惰默認抓取計劃)。然後在您確定需要關聯加載的地方使用熱切加載。但是,這取決於您的會話管理,因爲如果會話不再可用,延遲加載將不起作用。在book中有一個很好的描述計劃和策略。

0

爲了您的包映射,請刪除lazy =「false」。默認情況下是懶惰的。