【问题标题】:NHibernate Join Table with Non Primary Key非主键的 NHibernate 连接表
【发布时间】:2011-03-30 04:19:48
【问题描述】:

我正在尝试使用非主字段对 2 个表进行一对一连接。 我在数据库中有 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 表中检索一行时,我基本上都需要 Branch Name。 我想我可以在 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 个表时,是否有更好的解决方案?

提前感谢您的任何建议和建议, 祝你有美好的一天!

【问题讨论】:

  • 关系 Branch Has Many Salesman 和 Salesman References ( Branch 不适合你吗?Salesman 实体可以直接引用 Branch 对象。
  • @WorldIsRound:+1 好主意!在我的回答中,我什至没有想到它! =)
  • 您好 WorldlsRound,您能否详细说明您的 解决方案。我是否将 标记放置在 salesman 映射文件中并将 放置在分支映射文件中?我不明白这想让 nhiberate 知道如何匹配 BranchID。

标签: c# sql-server nhibernate


【解决方案1】:

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

此外,我只是认为您也许可以在使用依赖注入的同时使用复合映射。

Salesman s = new Salesman(branchInstance)

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

有关使用 NHibernate 的组件映射,请参见以下内容:

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

或者,如果您更喜欢使用 NHibernate 将其作为视图,也许命名查询应该只需较少更改即可:

  1. 16.2. Named SQL queries

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2011-04-21
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多