В настоящее время у меня есть устаревшая система, которая использует SP исключительно для доступа к БД.Мой объект домена выглядит примерно так:
public class User : EntityBase
{
public virtual string Name {get;set;}
public virtual string CreatedBy {get;set;}
public virtual DateTime CreatedDate {get;set;}
}
SP, который я отобразил, выглядел так:
CREATE PROCEDURE getUser
{
@ID int
}
select
Name
,(SELECT TOP 1 UserName FROM AuditTrail WHERE EntityID = [User].[ID] AND EntityName = 'User' AND AuditActionID = 1 ORDER BY DateStamp) AS CreatedBy
,(SELECT TOP 1 DateStamp FROM AuditTrail WHERE EntityID = [User].[ID] AND EntityName = 'User' AND AuditActionID = 1 ORDER BY DateStamp) AS CreatedDate
FROM [User]
WHERE [User].ID = @ID
Итак, как вы можете видеть, информация аудита отделена отСам объект в базе данных и CreatedBy / CreatedOn (и ModifiedBy / ModifiedOn) хранятся в отдельной таблице, которая называется AuditTrail.поле AuditActionID таблицы указывает, было ли это создание / обновление.
Как настроить это отображение с помощью NHibernate?Я посмотрел в JOIN, но он не дает мне возможности ограничить дополнительными значениями (и объединение не то, что я хочу).
Кроме того, если это возможно в Fluent NHibernate, это бонусно у меня все в порядке, просто попробовав стандартную конфигурацию сопоставления NHibernate, если она мне поможет.
ОБНОВЛЕНИЕ:
Я нашел один способ сделать это, но я не фанат.Я настроил SQLQuery, который считывает данные и отображает их обратно на объект.Это работает, но я бы хотел сделать это с помощью картографии.Возможно ли это даже потому, что «значения» из базы данных, на которую я отображаю, является подвыбором и недоступны для редактирования?
Решение:
Благодаря подсказке от Диего это было окончательное решениеЯ нашел (используя Fluent NHibernate, в моем файле ClassMap):
Map(x => x.CreatedBy).Formula("(SELECT TOP 1 AuditTrail.UserName FROM AuditTrail WHERE AuditTrail.EntityID = [ID] AND AuditTrail.EntityName = 'User' AND AuditTrail.AuditActionID = 1 ORDER BY AuditTrail.DateStamp)");
Map(x => x.CreatedDate).Formula("(SELECT TOP 1 AuditTrail.DateStamp FROM AuditTrail WHERE AuditTrail.EntityID = [ID] AND AuditTrail.EntityName = 'User' AND AuditTrail.AuditActionID = 1 ORDER BY AuditTrail.DateStamp)");
Спасибо, M