我目前有一个遗留系统,专门使用 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 映射配置(如果它能让我到达那里)。
UPDATE:
我找到了一种方法来做到这一点,但我不喜欢。我设置了一个 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)");
谢谢,
中号