Отказ от ответственности: я выделяю упрощенную картинку, чтобы подчеркнуть основную мысль моего вопроса.
Приложение, над которым я работаю, поддерживает набор ресурсов. У нас есть соответствующая таблица и сопоставленная сущность в NHibernate. Каждый ресурс идентифицируется целочисленным идентификатором. Также у нас есть пользовательская таблица и соответствующий объект для поддержки пользовательских профилей.
Нам нужно регистрировать доступ пользователей к приложению и получать историю доступа. Для класса репозитория мы должны ввести 2 метода:
- IEnumerable GetUserLog (Пользователь-пользователь) для извлечения порядка истории доступа пользователей по дате в порядке убывания и
- 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 ресурсов, к которым обращался пользователь.