2010-01-06 33 views
0

我正在將項目從NHibernate 1.2遷移到Nhibernate 2.1,並且遇到了一個奇怪的錯誤。 NHibernate正在將子實體的重複副本加載到集合屬性中。有沒有其他人遇到這個問題,你能提出一個解決辦法嗎?謝謝你的幫助。複製Nhibernate 2.1中的子實體?

以下是問題的詳細信息:我的項目是一個簡單的項目經理。感興趣的三個實體是項目,任務和ProjectNote。項目具有兩個集合屬性「任務」和「備註」,用於存放任務和ProjectNote對象。我的測試數據有幾個項目。項目#1有4個任務和2個註釋。但是,當加載項目#1時,它會顯示10個任務和10個註釋,並在每個集合中重複。如果我加載任何其他項目,我會得到同樣的結果。

這裏是類和映射文件。首先,我的項目類:

using System.Collections.Generic; 

namespace FsProjectManager.Common.Domain 
{ 
    public class Project 
    { 
     #region Constructor 

     public Project() 
     { 
      Initialize(); 
     } 

     #endregion 

     #region Properties 

     public virtual int ID { get; set; } 

     public virtual int Index { get; set; } 

     public virtual string Name { get; set; } 

     public virtual IList<ProjectNote> Notes { get; set; } 

     public virtual IList<Task> Tasks { get; set; } 

     #endregion 

     #region Private Methods 

     private void Initialize() 
     { 
      Tasks = new List<Task>(); 
      Notes = new List<ProjectNote>(); 
     } 

     #endregion 
    } 
} 

我的任務目標:

using System; 
using System.Collections.Generic; 

namespace FsProjectManager.Common.Domain 
{ 
    public class Task 
    { 
     #region Constructor 

     public Task() 
     { 
      Initialize(); 
     } 

     #endregion 

     #region Properties 

     public virtual int ID { get; set; } 

     public virtual int SequenceNumber { get; set; } 

     public virtual bool Completed { get; set; } 

     public virtual string Description { get; set; } 

     public virtual DateTime DueDate { get; set; } 

     public virtual IList<TaskNote> Notes { get; set; } 

     public virtual int NumDays { get; set; } 

     public virtual Project Parent { get; set; } 

     #endregion 

     #region Private Methods 

     private void Initialize() 
     { 
      Notes = new List<TaskNote>(); 
     } 

     #endregion 

    } 
} 

而且我ProjectNote類:

namespace FsProjectManager.Common.Domain 
{ 
    public class ProjectNote 
    { 
     #region Properties 

     public virtual int ID { get; set; } 

     public virtual Project Parent { get; set; } 

     public virtual string Text { get; set; } 

     #endregion 
    } 
} 

這裏是Project.hmb.xml文件:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        auto-import="true" 
        assembly="FsProjectManager.Common" 
        namespace="FsProjectManager.Common.Domain"> 

    <!-- Map class 'Project' --> 
    <class name="Project" table="Projects"> 

    <!-- Identifier column --> 
    <id name="ID" column="ID" type ="Int32" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 

    <!-- Simple properties --> 
    <property name="Name" column="Name" type="String" not-null="true" /> 

    <!-- Collection properties: Parent-side --> 
    <bag name="Tasks" table="Tasks" cascade="all-delete-orphan" inverse="true" fetch="join"> 
     <key column="ProjectID" /> 
     <one-to-many class="Task" /> 
    </bag> 

    <bag name="Notes" table="ProjectNotes" cascade="all-delete-orphan" inverse="true" fetch="join"> 
     <key column="ProjectID" /> 
     <one-to-many class="ProjectNote" /> 
    </bag> 


    </class> 

</hibernate-mapping> 

Task.hbm.xml文件:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        auto-import="true" 
        assembly="FsProjectManager.Common" 
        namespace="FsProjectManager.Common.Domain"> 

    <!-- Map class 'Task' --> 
    <class name="Task" table="Tasks"> 

    <!-- Identifier column --> 
    <id name="ID" column="ID" type ="Int32" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 

    <!-- Simple properties --> 
    <property name="Description" column="Description" type="String" /> 
    <property name="DueDate" column="DueDate" type="DateTime" /> 
    <property name="NumDays" column="NumDays" type="Int32" /> 

    <!-- Collection properties: Parent-side --> 
    <bag name="Notes" table="TaskNotes" cascade="all-delete-orphan" inverse="true" fetch="join"> 
     <key column="TaskID" /> 
     <one-to-many class="TaskNote" /> 
    </bag> 

    <!-- Collection properties: Child-side --> 
    <many-to-one name="Parent" column="ProjectID" class="Project" not-null="false" fetch="join" /> 

    </class> 

</hibernate-mapping> 

而且我ProjectNote.hbm.xml文件:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        auto-import="true" 
        assembly="FsProjectManager.Common" 
        namespace="FsProjectManager.Common.Domain"> 

    <!-- Map class 'ProjectNote' --> 
    <class name="ProjectNote" table="ProjectNotes"> 

    <!-- Identifier column --> 
    <id name="ID" column="ID" type ="Int32" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 

    <!-- Simple properties --> 
    <property name="Text" column="Text" type="String" /> 

    <!-- Collection properties: Child-side --> 
    <many-to-one name="Parent" column="ProjectID" class="Project" fetch="join" /> 

    </class> 

</hibernate-mapping> 

回答

0

我不知道該修補程序是什麼,但我認爲這個問題是,你有你的收藏2標記爲「取= '加入'」。將生成的SQL將返回10行。我猜快速修復會在集合上「fetch ='select'」。

+0

實際上,一個更簡單的解決方案是完全刪除'fetch'屬性並使用默認值。謝謝,克里斯! –