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

标签 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)");

谢谢,

最佳答案

您可以将 select 子句指定为 formula为您的属性(property)。

关于NHibernate,如何将属性映射到子选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3312722/

相关文章:

mysql - 将 DateTime 属性映射到时间戳 mysql+fluent nhibernate

nhibernate - 当具有相同术语的 HQL 选择有效时,为什么此 HQL 删除失败?

NHibernate + 无法将值 NULL 插入

c# - NHibernate 3.2 Loquacious API 入门

c# - Count=1 的此 SqlParameterCollection 的索引 1 无效

c# - Nhibernate对guid的相等限制

c# - 如何为两个 nHibernate session 维护一个对象?

NHibernate Image Storage - byte[] 值的长度超过了配置的长度

c# - Fluent NHibernate 加入不使用主键

NHibernate 代码优先迁移管理工具,如 EntityFramework、Django-South