0

我們有以下的數據庫結構:流利NHibernate的映射,從查找表返回描述

UserTeam table 
Id (PK, int not null) 
UserId (FK, int, not null) 
TeamId (FK, int, not null) 
RoleId (FK, int, not null) 

libRole table 
Id (PK, int not null) 
Description (varchar(255), not null) 

而且我們有一個實體如下:

public class UserTeam 
{ 
    public int Id { get; set; } 
    public Team Team { get; set; } 
    public User User { get; set; } 
    public int RoleId { get; set; } 
    public string Role { get; set; } 
} 

我們正在使用流利的NHibernate和自動配置的NHibernate (即,使用覆蓋自動映射類)。

我們試圖從libRole表中將JUST描述列插入到UserTeam表的「Role」屬性中,但真的很掙扎。以下是我們所得到的最接近:

public class UserTeamMap : IAutoMappingOverride<UserTeam> 
{ 
    public void Override(FluentNHibernate.Automapping.AutoMapping<UserTeam> mapping) 
    { 
     mapping.References(m => m.User).Column("UserId"); 
     mapping.References(m => m.Team).Column("TeamId"); 

     mapping.Join("Role", join => 
      { 
       join.Fetch.Join(); 
       join.KeyColumn("Id"); 
       join.Map(x => x.Role, "Description"); 
      }); 
    } 

} 

生成的SQL語句:

SELECT 
    TOP (@p0) this_.Id as Id70_0_, 
    this_.RoleId as RoleId70_0_, 
    this_.TeamId as TeamId70_0_, 
    this_.UserId as UserId70_0_, 
    this_1_.Description as Descript2_71_0_ 
FROM 
    [UserTeam] this_ 
inner join 
    libRole this_1_ 
     on this_.Id=this_1_.Id; 

關閉,但NHibernate的是在連接上使用UserTeam表和libRole表兩個ID列,當它應該在做this_.RoleId=this_1_.Id

我們缺少什麼?我們真的不想在應用程序中創建一個「libRole」實體,因爲我們真正關心的是描述值 - 這是用戶可配置的,所以我們不能僅僅使用枚舉。誰能幫忙?

回答

0

Join使用父表的主鍵。它不可能將其改爲外鍵。請參閱docs瞭解Join可能的更多細節。

在這種情況下,我會建議爲查找創建一個實體。但是,如果你真的想採取這種方法,你可以用映射一個公式的性質,即

Map(x => x.Role).Formula("(select description from libRole where Id = RoleId)"); 

注意,因爲它使用RoleId所以如果查詢有一個名爲RoleId則列另一個表,這是不完美DBMS在嘗試執行SQL時會發出抱怨。

+0

感謝penfold。我們考慮了公式路由,但寧願避免由於你提到的原因和因爲它不可能像sql連接一樣高效(不是我們正在處理libRole表中的數百萬行,但仍然)。似乎奇怪的是,有沒有辦法讓NHibernate從多個表中讀取實體的數據? – MajorRefactoring

+0

它看起來不能通過外鍵加入已經有一段時間了。參見[NH-1452](https://nhibernate.jira.com/browse/NH-1452)和[NH-3143](https://nhibernate.jira.com/browse/NH-3143)。已經有一些[已完成的工作](https://github.com/Nicaog/nhibernate-core/tree/NH-1681)添加此功能,但尚未與主幹合併。 – mickfold

+0

猜猜真的沒有辦法。最後,我們實際上從對象中刪除了Role屬性,因爲它在任何地方都沒有被使用 - 這是10年前的設計決策導致的宿醉......所以我將這個標記爲答案,認爲它會是很高興看到nhibernate在某些時候迎合它 - 如果我們真的想要它,我們可能需要分叉和修復自己:) – MajorRefactoring