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
归档时间: |
|
查看次数: |
3673 次 |
最近记录: |