que tienen una jerarquía de carpetas representado por la siguiente clase:¿Cómo utilizo Fluent NHibernate para mapear una jerarquía de carpetas autorreferencial?
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 otras palabras, cada Folder
puede pertenecer a un ParentFolder
, así como tener SubFolders
debajo de ella. Estoy usando el Automapper
de Fluent NHibernate y generando automáticamente el esquema de la base de datos usando SchemaExport
. Me da la siguiente tabla cuando intento de salvar algunas carpetas de prueba:
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
Hasta aquí todo bien, la columna de ParentFolder_id
se está estableciendo correctamente, aunque no sé por qué se creó otra columna Folder_id
. Ahora, cuando trato de ejecutar el siguiente código:
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());
}
El número devuelto es 0, y se ejecuta el siguiente código SQL:
SELECT count(Id) FROM [Folder] WHERE Folder_id = 1
Esta instrucción SQL es incorrecta. Que debería estar haciendo:
SELECT count(Id) FROM [Folder] WHERE ParentFolder_id = 1
Puede alguien decirme por qué Fluido NHibernate es la creación de la columna adicional Folder_id
y consulta sobre ella, y cómo se puede arreglar para que se consulta adecuadamente la columna de la ParentFolder_id
en su lugar? He intentado la siguiente anulación sin suerte:
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);
}
}
¿Qué versión de fluent-NH está ejecutando? Por lo que puedo decir, esto debe ser compatible con la versión 1.1: http://fluentnhibernate.lighthouseapp.com/projects/33236/tickets/115-self-referencing-relationships –
Estoy usando la cabeza del tronco desde hace unos días. –