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」實體,因爲我們真正關心的是描述值 - 這是用戶可配置的,所以我們不能僅僅使用枚舉。誰能幫忙?
感謝penfold。我們考慮了公式路由,但寧願避免由於你提到的原因和因爲它不可能像sql連接一樣高效(不是我們正在處理libRole表中的數百萬行,但仍然)。似乎奇怪的是,有沒有辦法讓NHibernate從多個表中讀取實體的數據? – MajorRefactoring
它看起來不能通過外鍵加入已經有一段時間了。參見[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
猜猜真的沒有辦法。最後,我們實際上從對象中刪除了Role屬性,因爲它在任何地方都沒有被使用 - 這是10年前的設計決策導致的宿醉......所以我將這個標記爲答案,認爲它會是很高興看到nhibernate在某些時候迎合它 - 如果我們真的想要它,我們可能需要分叉和修復自己:) – MajorRefactoring