Дублирование дочерних объектов в Nhibernate 2.1? - PullRequest
0 голосов
/ 06 января 2010

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

Вот подробности проблемы: Мой проект - простой менеджер проектов. Три объекта, представляющих интерес, это Project, Task и ProjectNote. Проект имеет два свойства коллекции, Задачи и Заметки, для хранения объектов Task и 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
    }
}

Объект My Task:

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>

1 Ответ

0 голосов
/ 06 января 2010

Я не уверен, что это за исправление, но я думаю, что проблема в том, что у вас есть две коллекции, помеченные как "fetch = 'join'". Сгенерированный SQL вернет 10 строк. Я думаю, что быстрое исправление будет "fetch = 'select'" для коллекций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...