2011-03-29 79 views
0

我正在嘗試使用非主字段與2個表進行一對一加入。 我在數據庫中有2個表格。NHibernate加入非主鍵字段表

CREATE TABLE [dbo].[Branch](
[BranchID] [int] IDENTITY(1,1) NOT NULL, 
[Branch_Name] [nvarchar](100) NULL) 

CREATE TABLE [dbo].[Salesman](
[SalesmanID] [int] IDENTITY(1,1) NOT NULL, 
[BranchID] [int] NOT NULL, 
[First_Name] [nvarchar](30) NULL, 
[Last_Name] [nvarchar](30) NULL) 

我基本上需要分支名稱,只要我從推銷員表中檢索一行。 我想我可以在Salesman.hbm.xml文件中添加一個連接。

<join table="dbo.Branch"> 
    <key column="BranchID" /> 
    <property lazy="true" update="false" insert="false"  not-null="false" type="String" name="Branch_Name" /> 
</join> 

這不起作用,因爲nHibernate總是使用主鍵創建連接。我讀了一些其他的帖子,他們建議使用這種情況下的視圖。因此,我創建像這樣一個觀點:

create view dbo.VIEW_Salesman As 
SELECT a.[SalesmanID], a.[BranchID], a.[First_Name],a.[Last_Name], 
(select [Branch_Name] FROM [dbo].[Branch] WHERE BranchID= a.[BranchID]) As Branch_Name 
FROM [dbo].[Salesman] as a 

上述觀點的實際工作,但那裏當你想加入使用非主域2代表一個更好的解決方案?

在此先感謝您的任何建議和意見, 祝您有美好的一天!

+1

關係分支是否有許多推銷員和推銷員參考(分支爲您工作?推銷員實體可以直接引用分支對象 – WorldIsRound 2011-03-29 20:18:59

+0

@WorldIsRound :+1好主意!在我的答案中,我甚至沒有想過它!=) – 2011-03-29 20:24:52

+0

嗨WorldlsRound可以詳細說明您的<多對一名稱=「Branch」/>解決方案。我是否將標記放在銷售員映射文件中,並將放在分支映射文件中?我不明白這是否會讓nhiberate知道匹配BranchID。 – Victor 2011-03-30 15:06:39

回答

0

你可以使用與NHibernate無關的Dependancy Injection,並且肯定會強制更改映射文件,或者在NHibernate配置文件中使用命名查詢。

此外,我只是覺得你也許可以在使用Dependancy Injection時使用複合映射。

Salesman s = new Salesman(branchInstance) 

所以,你應該有你的推銷員類中的一個分支屬性,可以讓你知道此業務員所屬的分公司名稱。否則,只需要一個BranchName屬性,該屬性實際上會返回branchInstance.Name屬性值。

參見使用NHibernate爲組件映射如下:

  1. NHibernate Mapping -;
  2. NHibernate - Chapter 7 - Component Mapping;
  3. NHibernate Reference Documentation

或者,如果你願意,使其作爲使用NHibernate一個觀點,也許命名查詢應該更小的變化做到這一點:

  1. 16.2. Named SQL queries

希望這有助於!不要猶豫,詢問更多細節,如果可以的話,我很樂意爲您提供幫助! =)