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

时间:2010-07-22 19:40:22

标签: 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;}
}

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来读取数据并将其映射回一个对象。它有效,但我喜欢通过映射来做到这一点。是否可能,因为我映射到的数据库中的“值”是一个子选择而不可编辑?

解决方案:

感谢Diego的提示,这是我找到的最终解决方案(在我的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)");

谢谢, 中号

1 个答案:

答案 0 :(得分:7)

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