Плавное соединение NHibernate для значения свойства

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

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

Модельные отношения

UserSession (таблица)

UserSessionId PK
ApplicationId FK
UserName

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

ApplicationId PK
Name

Пользовательская сессия (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)?


person Joe    schedule 17.05.2011    source источник


Ответы (2)


Если вам удастся сопоставить этот класс 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 ...). Также обратите внимание на именованные запросы.

person Stefan Steinegger    schedule 17.05.2011

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

Изменить:
Пример использования вашего нового объекта ниже:

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

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

person Cole W    schedule 17.05.2011
comment
Не могли бы вы показать пример? Псевдокода было бы достаточно. - person Joe; 17.05.2011
comment
Теперь, когда я думаю об этом, вот что я интерпретирую из этого сообщения. Создайте карту классов для приложения, используя ссылки (x = ›x.Application) .Fetch.Join (). Для этого потребуется, чтобы свойство моего объекта UserSession было типа Application. Чтобы выполнить контракт интерфейса, мне нужно, чтобы Map ApplicationName возвращал Application.Name. Я прав? Однако я бы предпочел не делать этого, если есть более элегантный способ. - person Joe; 17.05.2011
comment
Да, это близко. Вам не обязательно делать .Fetch.Join (). Если вы этого не сделаете, по умолчанию iirc будет загружаться лениво. См. Мой пример выше. - person Cole W; 17.05.2011