我正在將項目從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>
實際上,一個更簡單的解決方案是完全刪除'fetch'屬性並使用默認值。謝謝,克里斯! –