NHibernate, как отобразить свойство на подвыбор

У меня в настоящее время есть унаследованная система, которая использует SPS исключительно для доступа к DB. Мой объект области выглядит примерно так:

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? Я изучил СОЕДИНЕНИЕ, но оно не дает мне опцию ограничить дополнительными значениями (и соединение не то, что я хочу).

Кроме того, если это возможно в Быстром NHibernate, это - премия, но все хорошо с попыткой просто стандартный NHibernate, отображающий конфигурацию, если это получает меня там.

ОБНОВЛЕНИЕ:

Я нашел один способ сделать это, но я не поклонник. Я имею, устанавливают SQLQuery, который считывает данные и отображает их назад на объект. Это работает, но я хотел бы сделать это через отображение. Это даже возможно начиная со "значений" от базы данных, на которую я отображаюсь, подвыбор и не доступный для редактирования?

Решение:

Благодаря подсказке от Diego это было конечным решением, которое я нашел (использование Быстрого 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

8
задан Matthew Bonig 23 July 2010 в 16:43
поделиться