У меня в настоящее время есть унаследованная система, которая использует 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
Вы можете указать предложение select как формулу
для своего свойства.