2010-11-23 11 views
8

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); 
    } 
} 
+0

¿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 –

+0

Estoy usando la cabeza del tronco desde hace unos días. –

Respuesta

8

Creo que tendrá que especificar las columnas en las modificaciones de asignación.

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

Gracias, eso fue todo. Solo tenía que hacer que los dos lados de la relación usaran la misma columna: 'mapping.HasMany (x => x.SubFolders) .KeyColumn (" ParentFolder_id ");' y 'mapping.References (x => x.ParentFolder) .Column ("ParentFolder_id"); '. –

Cuestiones relacionadas