У меня есть иерархия папок, представленная следующим классом:
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; }
}
Другими словами, каждая папка
также может принадлежать ParentFolder
как и вложенные папки
под ним. Я использую Automapper
от Fluent NHibernate и автоматически генерирую схему базы данных с помощью 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);
}
}