Свободное соединение NHibernate для значения свойства - PullRequest
0 голосов
/ 17 мая 2011

Я пытаюсь присоединиться к таблице, чтобы получить и установить свойство в POCO.Вот сценарий ...

* ПРИМЕЧАНИЕ. - Приложение может принадлежать многим сеансам пользователя.

Model relationship

UserSession (таблица)

UserSessionId PK
ApplicationId FK
UserName

Приложение (Таблица)

ApplicationId PK
Name

UserSession (Poco)

string UserName get;
string ApplicationName get;

Я пробовал объединение следующим образом:

Join("Application", j => j.Inverse().KeyColumn("ApplicationId").Map(x => x.ApplicationName));

Однако это используетосновной столбец UserSessionTable для столбца соединения.Часть запроса выглядит следующим образом:

/**SNIP**/
inner join
 Auditing.UserSession US
     on this_.UserSessionId=US.UserSessionId
left outer join
 Auditing.Application A
     on US.UserSessionId=A.ApplicationId
/**SNIP**/

Как я могу свободно настроить nhibernate для использования правильного столбца соединения из левой таблицы (UserSession)?

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Джо, к сожалению, я не думаю, что вы можете указать этот столбец. Я считаю, что это ограничение nhibernate (не FluentNH). Есть обходные пути к этому. Вот статья с тем же типом вопроса:

Свободные таблицы соединений NHibernate при отображении без использования первичного ключа

Edit:
Пример использования вашей новой сущности ниже:

Ссылки (x => x.Application, "ApplicationId")

Это позволяет вам указать столбец, к которому вы присоединяетесь к таблице приложения.

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

Если вам удастся отобразить этот класс UserSession, у него будут побочные эффекты.Рассмотрим этот код:

// assume that both user sessions share the same Application.
UserSession userSession1 = session.Get<UserSession>(1);
UserSession userSession2 = session.Get<UserSession>(2);

// what should happen here?
userSession1.ApplicationName = "Blah";

Возможно, вы не захотите менять имя приложения в своем коде.Однако ORM необходимо синхронизировать данные всегда в обоих направлениях, чтобы иметь смысл.

Вы можете решить проблему, фактически отобразив ее в том виде, как она есть в базе данных, например, сделав приложение реальной сущностью.

class UserSession
{
  Application Application { get; private set; }
}

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

select session.Name, application.Name
from UserSession session join Application

Вы также можете создать новую структуру из запроса (select new ...).Также взгляните на именованные запросы.

...