2010-03-01 65 views
1

我開始懷疑,如果我實際上太愚蠢的使用NHibernate。我目前使用FluentNHibernate來創建簡單的數據庫映射,這對我們來說很好。當單獨處理我們的各種類時,我們能夠讀寫所有這些類,執行更新等。然而,我的問題是試圖建立一個查詢,涉及比對實體類型的字段進行過濾更復雜的任何事情。一個很好的例子被示出below--CreateAlias和NHibernate加入類無w /沒有映射關係

映射的相關部分:

public class UserMap : ClassMap<User> { 
    Id(u => u.Id).Column("UserID").GeneratedBy.Identity(); 
    //other non-pertinent fields 
} 

public class RoleMap : ClassMap<Role> { 
    Id(r => r.Id).Column("RoleId").GeneratedByIdentity(); 
    //snip 
} 

public class RoleMapMap : ClassMap<RoleMap> { 
    Id(rm => rm.Id).Column("RoleMapId").GeneratedByIdentity(); 
    Map(rm => rm.UserId); 
    Map(rm => rm.RoleId); 
    //snip 
} 

的目的是生成查詢瓦特/標準API檢索的特定角色的所有用戶 - 在高級別,根據特定角色ID篩選角色映射,然後加入到用戶,並僅返回這些用戶。

嘗試了以下操作,但我對CreateAlias的使用明顯存在缺陷,因爲運行時異常基本上告訴我,它不知道下面的「RoleMap」與User對象有關。

var criteria = session.CreateCriteria<User>(). 
       CreateAlias("RoleMap", "rm"). 
       Add(Expression.Eq("rm.UserId", "UserId")). 
       Add(Expression.Eq("rm.RoleId", 99)). 
       SetResultTransformer(new 
        DistinctRootEntityResultTransformer()); 

var users = criteria.List<User>(); 

有人能指出我正確的方向嗎?我不希望編輯底層對象來公開集合 - (例如User.Roles []集合),因爲有些情況下我們特別使用僅用於連接的表,但我們不希望浮動到中間層。所以學習如何參加孤立的課程對我們很重要。

+0

我不認爲你太愚蠢。我認爲nocoa的doco和使用是相當糟糕的。 – Mac 2011-07-06 04:22:16

回答

4

您的映射無法從User導航到RoleMap,但這正是您在Criteria API調用中所要做的。你有多個選項。這裏有一對夫婦:

1)允許用戶在您的映射中導航到RoleMap。這是最簡單的,它是如何正常完成的。

2)使用兩個查詢,其中一個獲取基於RoleMap到Role關係的UserIds列表,然後第二個查詢獲取這些UserIds的所有用戶。

你說你不想在你的中間層有一個User.Roles集合,但是NHibernate應該存在於你的數據層中,而不是你的業務層。您可以允許NHibernate瞭解User.Roles,同時有效地將其隱藏在業務層中。

加入孤立的類並不是真正爲其構建的ORM。 ORM是爲加入相關類而構建的。相關類通常映射到數據庫級別的相關表。要加入孤立的類,您需要執行上面的選項2,在其中運行多個查詢和/或解決自定義代碼中缺少關係的問題。