2012-05-04 67 views
3

我有我的「類別」對象下面的模型類:流利的NHibernate映射爲一個類別/子類別樹

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)的和所有其它的是子類中,w這可能只有1層深,或者可能是3,4,5層(遞歸父母備份到根/父類別ID。行/記錄之間關係的

例子:

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類中的「子類別」屬性需要檢索具有當前類別的「ParentCategoryId」所有類別(同上) ,但我不確定我如何去繪製這個圖。我已經嘗試了上例中顯示的HasMany映射,但失敗了。

回答

3

我相信我剛纔改變的hasMany映射到以下實施的工作解決了這個:

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

當我執行上述,我得到類別和子類別的正確關係。例如:1 => 4,5; 2 => 6,7。但我也得到列表子類別。所以最終看起來像1 => 4,5; 2 => 6,7; 4; 5; 6; 7.實際上是子類別的4-7也在類別中被檢索到同一級別。希望我對你有意義。你是怎麼解決這個問題的? – jaxxbo