我有一个像这样的层次结构类别表
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中的这个一样,我认为它是一个很好的解决方案,但我不能很好地遵循它以在我的项目中应用它。 有人可以给我一步一步的教程来实现这一目标吗?我的地图和班级是否正确?
答案 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()