Nhibernate - 如何懒惰地加载树结构?

时间:2015-06-30 14:08:47

标签: asp.net .net nhibernate lazy-loading

我有两个课程: lz_nc_Folder lz_nc_Document

lz_nc_Folder 包含lz_nc_Folder和lz_nc_Document的列表。我的类和地图结构是这样的:

public class lz_nc_Folder
{
        public lz_nc_Folder()
        {
            nc_Folders = new List<lz_nc_Folder>();
            nc_Documents = new List<lz_nc_Document>();
        }
        [DataMember]
        public virtual int id_folder { get; set; }
        [DataMember]
        public virtual int id_parent_folder { get; set; }
        [DataMember]
        public virtual string name_folder { get; set; }
        [DataMember]
        public virtual IList<lz_nc_Folder> nc_Folders { get; set; }
        [DataMember]
        public virtual IList<lz_nc_Document> nc_Documents { get; set; }
}
public partial class lz_nc_Document
{
        [DataMember]
        public virtual int id { get; set; }
        public virtual lz_nc_Folder parent_folder { get; set; }
        [DataMember]
        public virtual string title { get; set; }
}

public class lz_nc_FolderMap : ClassMap<lz_nc_Folder>
    {
        public lz_nc_FolderMap()
        {
            Table("nc_Folder");
            LazyLoad();
            Id(x => x.id_folder).GeneratedBy.Identity().Column("id_folder");
            Map(x => x.id_parent_folder).Column("id_parent_folder");
            Map(x => x.name_folder).Column("name_folder").Length(255);

            HasMany(x => x.nc_Folders).KeyColumn("id_parent_folder").BatchSize(100);
            HasMany(x => x.nc_Documents).KeyColumn("idFolder").BatchSize(100);
        }
    }

public class lz_nc_DocumentMap : ClassMap<lz_nc_Document>
{

        public lz_nc_DocumentMap()
        {
        Table("nc_Document");
        LazyLoad();
        Id(x => x.id).GeneratedBy.Identity().Column("id");
        References(x => x.parent_folder).Column("idFolder");    
        Map(x => x.title).Column("title").Length(100);

        }
}

我想要做的是执行此命令并获得结果:

lz_nc_Folder root = (from x in Session.Query<lz_nc_Folder>()
                                  where x.id_parent_folder == null
                                  select x)
                                  .FetchMany(x => x.nc_Folders)
                                  .FirstOrDefault();

如何在不使用eager-load的情况下递归获取此子文件夹的lz_nc_Folder?

我的问题的第二个版本是:我如何只使用fetch或fetchMany获取文档(这里不需要子文件夹)?我不想使用急切负载。我只需要在调用fetch / fetchmany时加载文档。

我希望这段代码能够成功执行:

lz_nc_Folder root = (from x in Session.Query<lz_nc_Folder>()
                                  where x.id_parent_folder == null
                                  select x)
                                  .FetchMany(x => x.nc_Notifications)
                                  .FirstOrDefault();

提前致谢。

0 个答案:

没有答案