2011-03-29 78 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

希望这有助于!不要犹豫,询问更多细节,如果可以的话,我很乐意为您提供帮助! =)