Как использовать Fluent NHibernate для сопоставления иерархии папок с самообращающимися ссылками? - PullRequest
8 голосов
/ 23 ноября 2010

У меня есть иерархия папок, представленная следующим классом:

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

Другими словами, каждый Folder может принадлежать ParentFolder, а также иметь SubFolders под ним. Я использую Fluent NHibernate Automapper и автоматически генерирую схему базы данных, используя SchemaExport. При попытке сохранить некоторые тестовые папки я получаю следующую таблицу:

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

Пока все хорошо, столбец ParentFolder_id устанавливается правильно, хотя я не знаю, почему он создал еще один столбец Folder_id. Теперь, когда я пытаюсь запустить следующий код:

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());
}

Возвращено число 0, и выполняется следующий SQL:

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

Это утверждение SQL неверно. Надо делать:

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

Может кто-нибудь сказать мне, почему Fluent NHibernate создает дополнительный столбец Folder_id и запрашивает его, и как я могу это исправить, чтобы он вместо этого правильно запрашивал столбец ParentFolder_id? Я попробовал следующее переопределение без удачи:

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

1 Ответ

8 голосов
/ 24 ноября 2010

Я думаю, вам нужно будет указать столбцы в переопределениях сопоставления.

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