Таблица соединения NHibernate с не первичным ключом - PullRequest
0 голосов
/ 30 марта 2011

Я пытаюсь сделать однозначное объединение с 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.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 голосов
/ 30 марта 2011

Вы можете либо использовать Dependancy Injection, которое на самом деле не имеет ничего общего с NHibernate, и определенно приведет к изменению файла сопоставления, либо, возможно, использовать именованный запрос в файле конфигурации NHibernate.

Кроме того, я просто подумал, что вы, возможно, могли бы использовать составное отображение при использовании Dependancy Injection.

Salesman s = new Salesman(branchInstance)

Таким образом, у вас должно быть свойство Branch в вашем классе Salesman, которое позволит вам узнать имя филиала, к которому принадлежит этот продавец. В противном случае просто используйте свойство BranchName, которое фактически возвращает значение свойства branchInstance.Name.

См. Следующее для сопоставления компонентов с использованием NHibernate:

  1. NHibernate Mapping - ;
  2. NHibernate - Глава 7 - Сопоставление компонентов ;
  3. Справочная документация NHibernate .

Или, если вы предпочитаете сделать это как представление, используя NHibernate, возможно, именованный запрос должен сделать это с меньшими изменениями:

  1. 16,2. Именованные SQL-запросы .

Надеюсь, это поможет! Не стесняйтесь спрашивать более подробную информацию, я буду рад помочь вам, если смогу! =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...