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);
}
}
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 –
J'utilise la tête du tronc d'il y a quelques jours. –