我目前有一个遗留系统,它专门使用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)");
谢谢, 中号
答案 0 :(得分:7)
您可以将select子句指定为属性的formula
。