2010-01-06 9 views
0

Я переношу проект из NHibernate 1.2 в Nhibernate 2.1, и я столкнулся с нечетной ошибкой. NHibernate загружает дубликаты копий дочерних объектов в свойства коллекции. Кто-нибудь еще сталкивается с этой проблемой, и можете ли вы предложить исправление? Спасибо за вашу помощь.Дублирование дочерних объектов в Nhibernate 2.1?

Вот подробности о проблемах: Мой проект - простой менеджер проектов. Три объекта, представляющие интерес: Project, Task и ProjectNote. Проект имеет два свойства коллекции: «Задачи и заметки» для хранения объектов Task и ProjectNote. У моих тестовых данных есть несколько проектов. Проект №1 имеет 4 задания и 2 примечания. Но когда загружается Project # 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

На самом деле еще более простым решением было полностью удалить атрибут «выборки» и перейти со значением по умолчанию. Спасибо, Крис! –

Смежные вопросы