NHibernate连接表与非主键

时间:2011-03-29 20:04:58

标签: c# sql-server nhibernate

我正在尝试使用非主要字段与2个表进行一对一连接。 我在DB中有2个表。

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表中检索一行时,我基本上都需要分支名称。 我以为我可以在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 个答案:

答案 0 :(得分:0)

您可以使用实际与NHibernate无关的Dependancy Injection,并且肯定会强制更改映射文件,或者可能在NHibernate配置文件中使用命名查询。

此外,我只是认为您在使用Dependancy Injection时可能会使用复合映射。

Salesman s = new Salesman(branchInstance)

因此,您的Salesman类中应该有一个Branch属性,可以让您知道此销售人员所属的分支名称。否则,只需要一个BranchName属性,该属性实际上将返回branchInstance.Name属性值。

使用NHibernate查看以下有关组件映射的内容:

  1. NHibernate Mapping - ;
  2. NHibernate - Chapter 7 - Component Mapping;
  3. NHibernate Reference Documentation
  4. 或者如果你更喜欢使用NHibernate将它作为一个视图,也许一个命名查询应该用更少的更改来完成它:

    1. 16.2. Named SQL queries
    2. 希望这有帮助!不要犹豫,询问更多细节,如果可以的话,我很乐意帮助你! =)