1

我有一些代碼,試圖訪問相同的關聯路徑兩次,他們是真正相同的別名,但因爲我使用查詢對象,我讓他們在兩個不同的地方,我不知道如何獲得別名。解決Nhibernate中的重複關聯路徑錯誤與查詢

可能是一些代碼可以清除困惑:

var privateBlogQuery = new BlogQuery() 
    .ByUser(1) 
    .RemoveHidden() 
    .FetchUserDetails(); 


//<-------- In Blog Query object class: ------> 

/// Gets all the private blogs the user has permissions to view 
public BlogQuery ByUser(int userId) 
{ 
    var authorisedUsers = null; 

    this.Left.JoinQueryOver(r => r.AuthorisedUsers,() => authorisedUsers) 
     .Where(r => r.User.Id == userId); 

    return this; 
} 

/// Removes all private blogs user has marked to be hidden 
public BlogQuery RemoveHidden() 
{ 
    var authorisedUsers = null; 

    this.Left.JoinQueryOver(r => r.AuthorisedUsers,() => authorisedUsers) 
     .Where(r => !r.IsHidden); 

    return this; 
} 

/// Loads up details of all users who have permission 
/// to view the private blog 
public BlogQuery FetchUserDetails() 
{ 
    var users = null; 
    var authorisedUsers = null; 

    this.Left.JoinQueryOver(r => r.AuthorisedUsers,() => authorisedUsers) 
     .Left.JoinQueryOver(r => r.User,() => users); 

    return this; 
} 

有些時候,我使用所有的3個標準分別與生成的SQL正是我所需要的一切是很好,很正常,只要他們分開使用。

現在我需要一起使用它們,同時nhibernate會拋出一個異常duplicate alias,並且我改變了這三個函數的別名,但隨後我用duplicate association path模仿了迎接。

谷歌搜索了一下,我learnt that it is a bug in hibernate而且我還發現了幾個workarounds on this bug

麻煩的是我使用的查詢對象,因此查詢結束了,我真的不知道怎麼在這裏得到的關聯路徑/別名。

那麼我該怎麼辦呢?

+0

這是一個非常具體的解決方法,可能並不適用於您的情況,但我能解決這個問題,當我碰到了?我的表映射到該做的加入對我來說 – 2013-05-08 14:26:22

回答

1
  • 化妝authorisedUsersBlogQuery一個membervariable和使用標記/標記知道ByUserRemoveHidden應該做的加入
  • 使用JoinAlias

例如

AuthorisedUser authorisedUser; 
bool authorisedUsersJoined; 

public BlogQuery RemoveHidden() 
{ 
    if (!authorisedUsersJoined) 
     this.Left.JoinAlias(r => r.AuthorisedUsers,() => authorisedUser); 

    this.Where(() => !authorisedUser.IsHidden); 

    return this; 
} 

FetchUserDetails是相互的與另外兩個因素相互排斥,因爲過濾關聯會阻止NH初始化關聯。您需要使用過濾器進行子查詢並查詢生成的Ids,然後進行初始化。

/// Loads up details of all users who have permission 
/// to view the private blog 
public BlogQuery FetchUserDetails() 
{ 

    this.Query = QueryOver.Of<Blog>() 
     .WhereRestrictionOn(b => b.Id).IsIn(this.Query.Select(b => b.Id)) 
     .Fetch(r => r.AuthorisedUsers).Eager 
      .ThenFetch(au => au.User).Eager; 

    return this; 
} 
+0

架構綁定視圖嗨 - 如何獲取/設置'.Where(()=>!authorisedUser.IsHidden);''authorisedUsersJoined''是否爲真?因爲無論如何我需要設置該條件,所以我需要知道一個連接是否已經被執行。 – LocustHorde 2013-05-13 15:29:59

+0

感謝第二個代碼片段,這看起來很有前景 – LocustHorde 2013-05-13 15:30:19

+0

我修復了代碼。無論 – Firo 2013-05-13 20:23:26

相關問題