Соединение NHibernate на неправильном поле - PullRequest
1 голос
/ 10 мая 2011

Я очень новичок в Nhibernate, я знаю, в чем заключается моя проблема, но не знаю, как ее исправить.

Проблема: пользователь присоединяется к сотруднику через идентификатор сотрудника, а не идентификатор пользователя. Что вызывает проблемы, поскольку возвращает неправильные детали.

Employee.hbm.xml
<many-to-one name="User" unique="true" column="UserID" />

User.hbm.xml
<one-to-one name="Employee" foreign-key="EmployeeID" class="Employee" lazy="false" />

Employee.cs
public virtual int EmployeeID { get; set; }
public virtual User User { get; set; } - This is UserID within the actual database
public virtual string EmailAddress { get; set; }

User.cs
public virtual int UserID { get; set; }
public virtual string Username { get; set; }
public virtual string Title { get; set; }
public virtual string Forename { get; set; }
public virtual string Surname { get; set; }
public virtual Employee Employee { get; set; }

Выше было закодировано кем-то другим, и я пытаюсь это исправить. Я пытался изменить

<one-to-one name="Employee" foreign-key="UserID" class="Employee" lazy="false" />

однако это все еще вызывает проблемы.

Я что-то упустил? Заранее благодарен за любую помощь: -)

Clare

UPDATE

Я надеялся, что он будет один-к-одному присоединяться к идентификатору пользователя, однако он все еще присоединяется к идентификатору сотрудника. У кого-нибудь есть другие идеи? Еще раз спасибо: -)

Employee.hbm.xml
<one-to-one name="User" foreign-key="UserID" class="User" lazy="false" />

User.hbm.xml
<one-to-one name="Employee" foreign-key="UserID" class="Employee" lazy="false" />

Ответы [ 3 ]

1 голос
/ 10 мая 2011

Вы не должны указывать имя столбца в one-to-one сопоставлении , потому что этот фрагмент информации является частью сопоставления many-to-one на другой стороне отношения.

Чтобы решить вашу проблему, вы должны удалить атрибут foreign-key из сопоставления one-to-one объекта User:

<one-to-one name="Employee" class="Employee" lazy="false" />

NHibernate будет использовать информацию вmany-to-one Отображение, определенное в сущности Employee для построения операторов SQL.

Примечание , что если Employee всегда имеет User, связанный с ним (то есть * 1023)* свойство никогда не может быть null), тогда вы должны указать этот факт в сопоставлении one-to-one, добавив атрибут constrained:

<one-to-one name="Employee" class="Employee" constrained="true" lazy="false" />

Связанные ресурсы:

0 голосов
/ 09 июня 2011

Я бы использовал здесь отношение «многие к одному», потому что я знаю, что вы можете объединить учетные записи пользователей, и один к одному может вызвать проблемы с переносом записи сотрудника в объединенного пользователя.

Если вы рассматриваете это как то, что ваш пользователь может иметь несколько записей о сотрудниках, то это позволяет избежать этой проблемы.

Вы пробовали что-то вроде следующего:

Employee.hbm.xml

User.hbm.xml

http://ayende.com/blog/3938/nhibernate-mapping-many-to-one

0 голосов
/ 10 мая 2011

Согласно вашим организациям, между пользователем и сотрудником нет отношений один к одному. Пожалуйста, смотрите это объяснение:

http://jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/

Я думаю, вам нужно вместо этого указать один к одному как многие к одному.

Edit:
Думаю, я неправильно понял ваш сценарий.
Вы можете использовать property-ref здесь. Итак, ваше отображение будет выглядеть так:

<one-to-one name="Employee" class="Employee" property-ref="User" lazy="false" />

Пожалуйста, проверьте следующую ссылку для более подробной информации: Документация Nhibernate

Также здесь есть аналогичный пост по SO: один-к-одному с указанием столбца

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