Каков наилучший способ получения / сохранения записей журнала, связанных с другими объектами через NHibernate? - PullRequest
0 голосов
/ 19 апреля 2011

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

Приложение, над которым я работаю, поддерживает набор ресурсов. У нас есть соответствующая таблица и сопоставленная сущность в NHibernate. Каждый ресурс идентифицируется целочисленным идентификатором. Также у нас есть пользовательская таблица и соответствующий объект для поддержки пользовательских профилей.

Нам нужно регистрировать доступ пользователей к приложению и получать историю доступа. Для класса репозитория мы должны ввести 2 метода:

  1. IEnumerable GetUserLog (Пользователь-пользователь) для извлечения порядка истории доступа пользователей по дате в порядке убывания и
  2. void WriteLogEntry (пользователь, ресурсный ресурс) для записи новой записи

Я попытался просто определить сущность LogEntry следующим образом:

public class LogEntry
{
     public virtual User User {get; set;}
     public virtual Resource Resource {get; set;}
     public virtual DateTime Date {get; set;}
}

и отобразите его, как обычно, с помощью Fluent NHibernate. Для извлечения / обновления записей журнала мы можем просто использовать

Session.Query<LogEntry>().Where(entry => entry.User = currentUser).OrderByDesc(entry => entry.Date)
Session.Save(new LogEntry() {
    User = currentUser,
    Resource = resource,
    Date = DateTime.Now
})

Это наиболее удобный для нас способ решения этой проблемы.

Задача Проблема в том, что NHibernate требует отображения идентификаторов. Здесь мы должны использовать составной идентификатор, и единственный вариант - сопоставить столбцы «Пользователь», «Ресурс» и «Дата», потому что только эта комбинация обеспечивает уникальность. Также в случае составного идентификатора мы должны переопределить Equals и GetHashCode, и все это кажется излишним для такой простой задачи. Другая проблема в том, что отложенная загрузка не может быть использована для полей идентификаторов, и это слишком много. Мы не хотим загружать все связанные объекты ресурсов заранее.

Другое возможное решение - определить простой класс, а не сущность, а затем использовать SetResultTransformer (Transformers.AliasToBean ()) для получения результатов. В этом случае мы должны конструировать запросы вручную, вручную извлекать связанные объекты, и таким образом в общем случае не лучше, чем иметь дело с необработанным соединением.

Я хотел бы спросить мнение эксперта, потому что я уверен, что окружающие имели подобный опыт и могут помочь. Заранее спасибо.

P.S. Это ASP.NET MVC приложение, использующее NHibernate 3 (+ свободно). Информация журнала будет использоваться для отображения последних 5-10 ресурсов, к которым обращался пользователь.

1 Ответ

1 голос
/ 20 апреля 2011

рассматривали ли вы вопрос о введении поля Id для таблицы LogEntry?
многие администраторы БД рекомендуют его, и это кажется самым простым решением.

...