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

时间:2010-11-23 20:11:35

标签: c# nhibernate fluent-nhibernate nhibernate-mapping mapping

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

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下有Automapper。我使用Fluent NHibernate&#39; 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()); } 列。现在,当我尝试运行以下代码时:

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

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

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

这个SQL语句错了。应该这样做:

Folder_id

有人能告诉我为什么Fluent NHibernate会创建额外的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}}

1 个答案:

答案 0 :(得分:8)

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

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