2010-01-06 5 views
0

Je migre un projet de NHibernate 1.2 vers Nhibernate 2.1, et j'ai rencontré une erreur étrange. NHibernate charge des copies d'entités enfants en double dans les propriétés de la collection. Est-ce que quelqu'un d'autre a rencontré ce problème, et pouvez-vous suggérer une solution? Merci de votre aide.Duplication d'entités enfants dans Nhibernate 2.1?

Voici les détails du problème: Mon projet est un simple gestionnaire de projet. Les trois entités d'intérêt sont Project, Task et ProjectNote. Un projet a deux propriétés de collection, tâches et notes, pour contenir des objets Task et ProjectNote. Mes données de test ont plusieurs projets. Le projet 1 a 4 tâches et 2 notes. Mais lorsque le projet n ° 1 est chargé, il affiche 10 tâches et 10 notes, avec répétition dans chaque collection. J'obtiens le même genre de résultat si je charge l'un des autres projets.

Voici les classes et les fichiers de mappage. Tout d'abord, ma classe de projet:

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 
    } 
} 

Mon objet Tâche:

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 

    } 
} 

Et ma classe 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 
    } 
} 

Voici le fichier 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> 

Le fichier 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> 

Et mon fichier 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> 

Répondre

0

Je ne suis pas sûr de ce que le correctif est, mais je pense que le problème est que vous avez vos 2 collections marquées comme « fetch = 'joindre'". Le SQL qui serait généré retournerait 10 lignes. Je suppose que la solution rapide serait "fetch = 'select'" sur les collections.

+0

En fait, une solution encore plus simple était de supprimer complètement l'attribut 'fetch' et d'aller avec la valeur par défaut. Merci, Chris! –

Questions connexes