NHibernate, как сопоставить свойство для подвыбора - PullRequest
8 голосов
/ 22 июля 2010

В настоящее время у меня есть устаревшая система, которая использует 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

1 Ответ

7 голосов
/ 23 июля 2010

Вы можете указать предложение select как formula для вашей собственности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...