Вот одна идея. Я никогда не реализовывал это, поэтому возьмите его с крошкой соли, пока не проверите его.
Создайте другой класс, который инкапсулирует данные аудита для Person
- PersonCreation
или чего-то еще.
Дайте ему идентификатор, дату создания и свойство by-by, а также свойство для идентификатора Person
(я не вижу необходимости ссылаться на Person
, если только идентификатор не является публичным, в этом случае вы можете захотеть WeakReference
, чтобы не хранить каждый экземпляр Person
в памяти на весь срок службы приложения).
Вам потребуется создать отображение для NHibernate, чтобы получить PersonCreation
объекты из таблицы Person
.
Отсюда вы можете просто использовать методы расширения для извлечения данных при вызове. Это может или не может быть разумным в зависимости от вашего использования. Вам придется каждый раз создавать новый сеанс или синхронизировать статический сеанс.
Или ...
В классе static
, который содержит ваши методы расширения CreatedBy()
и CreatedDate()
, создайте статический IDictionary<int, PersonCreation>
для хранения деталей для каждого Person
. Поскольку данные для создания, по-видимому, неизменяемы, нам не нужно беспокоиться о том, что это станет устаревшим.
Вам нужно будет группировать запросы для PersonCreation
с вашими запросами Person
. Например, вы можете сделать что-то вроде:
var creation = session.CreateCriteria<PersonCreation>()
.Add(Restrictions.Eq("PersonId", 1))
.Future<PersonCreation>();
var person = session.CreateCriteria<Person>()
.Add(Restrictions.IdEq(1))
.UniqueResult<Person>();
Вызывая Future<T>()
, вы говорите NHibernate не выполнять этот запрос до тех пор, пока сеанс в любом случае не будет добавлен в базу данных.
Как только вы получите результаты, вы можете взять первый результат создания и добавить его в словарь (чтобы методы расширения имели к нему доступ) и вернуть человека.
Когда вы вызываете person.CreatedDate()
, метод может просто извлечь данные из словаря, используя идентификатор переданного параметра Person
или самого Person
.