流畅的NHibernate映射和检索层次结构表

时间:2013-06-07 02:38:25

标签: fluent-nhibernate hierarchy fluent-nhibernate-mapping

我有一个像这样的层次结构类别表

Id int,
Description varchar(100),
ParentId int,
Ordinal int,
IsActive bit

我想从父级到子级获取所有类别,因此当我调用session.get<Category>(id)时,它已经获取了所有子级。这是我的地图和课程:

class Category
{
    public virtual int Id {get; set;}
    public virtual string Description {get; set;}
    public virtual int ParentId {get; set;}
    public virtual int Ordinal {get; set;}
    public virtual bool IsActive {get; set;}
}

class CategoryMap : ClassMap<Category>
{
    public CategoryMap()
    {
         Table("TB_CATEGORY");
         Id(f => f.Id).GeneratedBy.Native();
         Map(f => f.Description);
         Map(f => f.ParentId);
         Map(f => f.Ordinal);
         Map(f => f.IsActive);
    }
}

我搜索了很多文章,在使用他们的解决方案时仍然感到困惑,因为他们没有告诉我有关表格结构和映射的信息。像ayende blog中的这个一样,我认为它是一个很好的解决方案,但我不能很好地遵循它以在我的项目中应用它。 有人可以给我一步一步的教程来实现这一目标吗?我的地图和班级是否正确?

1 个答案:

答案 0 :(得分:1)

使用以下类

class Category
{
    public virtual int Id {get; private set;}
    public virtual string Description {get; set;}
    public virtual Category Parent {get; set;}
    public virtual bool IsActive {get; set;}
    public virtual IList<Category> Children {get; private set;}

    public override bool Euqals(object obj)
    {
        var other = obj as Category;
        return other != null && (Id == 0) ? ReferenceEquals(other, this) : other.Id == Id;
    }

    public override int GetHashCode()
    {
        return Id;
    }
}

class CategoryMap : ClassMap<Category>
{
    public CategoryMap()
    {
         Table("TB_CATEGORY");
         Id(f => f.Id).GeneratedBy.Native();
         Map(f => f.Description);
         References(f => f.Parent).Column("ParentId");
         HasMany(f => f.Children)
             .AsList(i => i.Column("Ordinal"))      // let the list have the correct order of child items
             .KeyColumn("ParentId")
             .Inverse();              // let the reference maintain the association
         Map(f => f.IsActive);
    }
}

然后你可以查询

var categoriesWithChildrenInitialised = session.QueryOver<Category>()
    .Fetch(c => c.Children).Eager
    .List()