2009-12-14 86 views
1

有沒有一種方法可以過濾HasManyToMany映射中的行?FluentNHibernate HasManyToMany條件映射

我有三個表(傳統,無法更改它們)服務,資源和ResourceService。 ResourceService允許多個資源鏈接到多個服務,但它也有一個「活動」列。

在我的資源域對象上,我用一個「ProvidedBy」屬性映射了鏈接到資源的服務,該屬性返回一個服務數組。問題是我只需要來自標記爲活動的服務的行。

我在這裏錯過了一些基本的東西嗎?

回答

4

流利的NHibernate版本1.0不支持NHibernate過濾器或filter-defs。我向詹姆斯格雷戈裏提交了一個補丁,並且他們現在已經整合到了後備箱中,所以如果你獲得了後備箱而不是發佈版本,你會發現包含這種功能的能力。

本質上講,你可以設置從FilterDefinition繼承像這樣一類:

public class TestFilter : FilterDefinition 
{ 
    public TestFilter() 
    { 
     WithName("test") 
      .WithCondition("Age > :age") 
      .AddParameter("age", NHibernateUtil.Int32); 
    } 
} 

,然後在你的流利的映射應用此過濾器:

HasManyToMany(x => x.Oldies) 
    .Table("People") 
    .ApplyFilter<TestFilter>(); 

您可以設置參數值,啓用過濾器使用會話對象正常:

session.EnableFilter("test").SetParameter("age", 65); 
+1

這似乎給我想要做的,但如果說流利不支持任何其他方法,我想這是我必須做的相當重量級的! – 2009-12-14 09:29:52

+0

這不是什麼Fluent支持的問題,而是NHibernate支持的問題。如果您願意,您可以隨時使用XML映射文件來定義和應用您的過濾器......;) – 2009-12-14 09:34:16

0

Wouldn這是否是Where的候選人?

HasManyToMany(x => x.Whatevers) 
    .Where(x => x.Active); 
+0

恐怕不行。我希望過濾的列是「ResourceService」表,它是鏈接表。 我沒有給它一個鏡頭,但是編譯器不喜歡它: HasManyToMany(功能(O作爲服務)o.ProvidedBy)_ .Cascade()_ 。所有()_ 。表(「ResourceService 「)_ .ParentKeyColumn(」ServiceId「)_ .ChildKeyColumn(」ResourceId「)_ .Where(Function(x As ResourceService)x.Active) – 2009-12-18 11:45:33

+2

Blasted formatting。 – 2009-12-18 11:46:07