类别/子类别树的流畅NHibernate映射

时间:2012-05-04 12:36:01

标签: fluent-nhibernate mapping nhibernate-mapping

我的'类别'对象有以下模型类:

public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Category ParentCategory { get; set; }

public virtual IList<Category> SubCategories { get; set; }

这是我对'类别'的流利的nhibernate映射类:

Id(x => x.Id).GeneratedBy.Native();

Map(x => x.Name);
References(x => x.ParentCategory).Column("ParentCategoryId");

// ** THE BELOW MAPPING IS WHAT I'M UNSURE ABOUT **
HasMany(x => x.SubCategories).Where(x => x.Id == x.ParentCategory.Id);

我所涉及的数据库由许多“类别”组成,其中一些属于根级别(并且具有ParentCategoryId = NULL),而所有其他类别都是子类别,可能只有1级深度,或者可能是3,4,5级深度(递归父级备份到root / parent CategoryId。

行/记录之间的关系示例:

Cars (Id = 1 - ParentCategoryId = NULL)
Cars (Id = 1) > Hatchback (Id = 2 - ParentCategoryId = 1)
Cars (Id = 1) > Hatchback (Id = 2) > Ford (Id = 3 - ParentCategoryId = 2)

Motorcycles (Id = 4 - ParentCategoryId = NULL)
Motorcycles (Id = 4) > Scooters (Id = 5 - ParentCategoryId = 4)

我的Category类中的' SubCategories '属性需要检索所有具有当前类别(Id)的' ParentCategoryId '的类别,但我不确定我如何绘制这个。我已经尝试过上面示例中显示的HasMany映射,但失败了。

1 个答案:

答案 0 :(得分:3)

我相信我刚刚通过将HasMany映射更改为以下内容来实现一个有效的解决方案:

HasMany(x => x.SubCategories)
.Cascade.AllDeleteOrphan()
.KeyColumn("ParentCategoryId")
.Where(x => x.ParentCategory.Id == x.Id)