2010-07-22 12 views
8

Şu anda DB'ye erişim için SP'leri kullanan eski bir sistemim var. Gördüğünüz gibi denetim bilgileri varlık kendisinden ayrılır, YaniNHibernate, bir mülkün bir alt seçime nasıl eşleştirileceği

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 

:

public class User : EntityBase 
{ 
    public virtual string Name {get;set;} 
    public virtual string CreatedBy {get;set;} 
    public virtual DateTime CreatedDate {get;set;} 
} 

bu haritalı var SP şuna benziyordu: Alanım nesne şuna benzer database ve CreatedBy/CreatedOn (ve ModifiedBy/ModifiedOn), AuditTrail adlı ayrı bir tabloda saklanır. Tablodaki AuditActionID alanı, bir oluşturma/güncelleştirme olup olmadığını belirtir.

Bu eşleştirmeyi NHibernate ile nasıl kurabilirim? JOIN'e baktım ama bana ek değerler ile kısıtlama seçeneği sunmuyor (ve bir katılım istediğim şey değil).

Ayrıca, eğer Fluent NHibernate'de bu mümkün ise, bu bir ikramiyedir, ancak eğer beni oraya götürürse standart NHibernate eşleme yapılandırmasını denemekten iyidir.

GÜNCELLEME: Ben bunu yapmanın bir yolunu bulmuş, ama hayranı değilim

. Verileri okuyan ve bir nesneye geri döndüren bir SQLQuery kurdum. Çalışıyor, ancak bunu haritalama yoluyla yapmayı çok isterim. Eşleştirdiğim veritabanındaki "değerler" bir alt seçim ve düzenlenebilir olmadığından mümkün mü?

Çözüm:

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

sayesinde M

cevap

7

: Diego'dan ucuna

sayesinde bu (benim ClassMap dosyasında Akıcı NHibernate, kullanarak) buldum nihai çözüm oldu Seçtiğiniz maddeyi, mülkünüz için formula olarak belirtebilirsiniz.

İlgili konular