如何使用Fluent NHibernate映射自引用文件夹层次结构?

Dan*_* T. 8 c# mapping nhibernate nhibernate-mapping fluent-nhibernate

我有一个由以下类表示的文件夹层次结构:

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; }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,每个都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
Run Code Online (Sandbox Code Playgroud)

到目前为止一直很好,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());
}
Run Code Online (Sandbox Code Playgroud)

返回的计数为0,并执行以下SQL:

SELECT count(Id) FROM [Folder] WHERE Folder_id = 1
Run Code Online (Sandbox Code Playgroud)

这个SQL语句是错误的.它应该做:

SELECT count(Id) FROM [Folder] WHERE ParentFolder_id = 1
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我为什么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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Phi*_*ill 8

我认为你必须在映射覆盖上指定列.

mapping.HasMany(x => x.SubFolders).KeyColumn("ParentFolder_id");
Run Code Online (Sandbox Code Playgroud)