NHibernate,如何将属性映射到子选择

Mat*_*nig 8 nhibernate fluent-nhibernate

我目前有一个遗留系统,它使用SP专门访问数据库.我的域对象看起来像这样:

public class User : EntityBase
{
    public virtual string Name {get;set;}
    public virtual string CreatedBy {get;set;}
    public virtual DateTime CreatedDate {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我有这个映射的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
Run Code Online (Sandbox Code Playgroud)

因此,如您所见,审计信息在数据库中与实体本身分开,CreatedBy/CreatedOn(和ModifiedBy/ModifiedOn)存储在名为AuditTrail的单独表中.表上的AuditActionID字段指定它是否是创建/更新.

如何使用NHibernate设置此映射?我查看了JOIN,但它没有给我选项来限制其他值(并且连接不是我想要的).

另外,如果在Fluent NHibernate中这是可能的,这是一个额外的奖励,但如果它能让我在那里尝试标准的NHibernate映射配置,那我就没问题了.

更新:

我找到了一种方法来做到这一点,但我不是粉丝.我已经设置了一个SQLQuery来读取数据并将其映射回一个对象.它有效,但我喜欢通过映射来做到这一点.是否可能,因为我映射到的数据库中的"值"是一个子选择而不可编辑?

解:

感谢迭戈的提示,这是我找到的最终解决方案(在我的ClassMap文件中使用Fluent NHibernate):

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)");
Run Code Online (Sandbox Code Playgroud)

谢谢,M

Die*_*hon 7

您可以将select子句指定formula为属性.