2010-11-23 27 views
8

J'ai une hiérarchie de dossiers représentée par la classe suivante:Comment utiliser Fluent NHibernate pour mapper une hiérarchie de dossiers auto-référencée?

public class Folder 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Folder ParentFolder { get; set; } 
    public virtual ICollection<Folder> SubFolders { get; set; } 
} 

En d'autres termes, chaque Folder peut appartenir à un ParentFolder, ainsi que SubFolders avoir en dessous. J'utilise Automapper de Fluent NHibernate et génère automatiquement le schéma de base de données en utilisant SchemaExport. Je reçois le tableau suivant lorsque je tente de sauver des dossiers de test:

Id | Name      | ParentFolder_id | Folder_id 
---------------------------------------------------------------- 
1 | Root Folder (has children) | NULL   | NULL 
2 | Root Folder (no children) | NULL   | NULL 
3 | Sub Folder     | 1    | NULL 
4 | Sub Sub Folder    | 2    | NULL 

Jusqu'à présent, si bon, la colonne ParentFolder_id est en cours correctement réglée, même si je ne sais pas pourquoi il a créé une autre colonne Folder_id. Maintenant, quand je tente d'exécuter le code suivant:

using (var session = SessionFactory.OpenSession()) 
{ 
    // I'm using NHibernate 3 
    var rootFolder = session.Query<Folder>() 
          .Where(x => x.Name.StartsWith("root").First(); 

    Console.WriteLine(rootFolder.SubFolders.Count()); 
} 

Le nombre retourné est 0, et l'instruction SQL suivante est exécutée:

SELECT count(Id) FROM [Folder] WHERE Folder_id = 1 

Cette instruction SQL est erronée. Il devrait faire:

SELECT count(Id) FROM [Folder] WHERE ParentFolder_id = 1 

Quelqu'un peut-il me dire pourquoi Fluent NHibernate crée la colonne Folder_id supplémentaire et l'interrogation sur elle, et comment je peux le réparer afin qu'il interroge correctement la colonne ParentFolder_id à la place? J'ai essayé le remplacement suivant sans la chance:

public class FolderOverride : IAutoMappingOverride<Folder> 
{ 
    public void Override(AutoMapping<Folder> mapping) 
    { 
     mapping.HasMany(x => x.SubFolders).Inverse(); // I thought inverse might fix it, but no dice 
     mapping.References(x => x.ParentFolder); 
    } 
} 
+0

Quelle version de fluent-NH utilisez-vous? Pour autant que je puisse dire, cela devrait être pris en charge dès la sortie de la boîte à partir de la version 1.1: http://fluentnhibernate.lighthouseapp.com/projects/33236/tickets/115-self-referencing-relationships –

+0

J'utilise la tête du tronc d'il y a quelques jours. –

Répondre

8

Je pense que vous devrez spécifier les colonnes sur vos remplacements de mappage.

mapping.HasMany(x => x.SubFolders).KeyColumn("ParentFolder_id"); 
+0

Merci, ça l'a fait. Je devais juste faire que les deux côtés de la relation utilisaient la même colonne: 'mapping.HasMany (x => x.SubFolders) .KeyColumn (" ParentFolder_id ");' et 'mapping.References (x => x.ParentFolder) .Column ("ParentFolder_id"); '. –