2010-07-22 12 views
8

पर किसी संपत्ति को मानचित्र कैसे करें, वर्तमान में मेरे पास एक विरासत प्रणाली है जो विशेष रूप से डीबी तक पहुंच के लिए एसपी का उपयोग करती है।NHibernate, किसी उप-समूह

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

सपा रहा है कि इस मैप किया गया इस तरह देखा:: मेरे डोमेन वस्तु कुछ इस तरह दिखता

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 

तो, जैसा कि आप देख सकते हैं, ऑडिट जानकारी इकाई पर ही से अलग है डेटाबेस और बनाया गया/बनाया गया (और संशोधित/संशोधित ओएन) ऑडिट ट्रायल नामक एक अलग तालिका में संग्रहीत किया जाता है। तालिका पर AuditActionID फ़ील्ड निर्दिष्ट करता है कि यह एक निर्माण/अद्यतन था या नहीं।

मैं इस मैपिंग को NHibernate के साथ कैसे सेटअप कर सकता हूं? मैंने जॉइन में देखा लेकिन यह मुझे अतिरिक्त मूल्यों से प्रतिबंधित करने का विकल्प नहीं देता है (और जो भी मैं चाहता हूं वह नहीं है)।

इसके अलावा, यदि फ्लुएंट एनएचबर्ननेट में यह संभव है, तो यह एक बोनस है, लेकिन अगर मैं वहां जाता हूं तो मैं केवल मानक एनएचबर्ननेट मैपिंग कॉन्फ़िगरेशन की कोशिश करने के साथ ठीक हूं।

अद्यतन:

मैं एक तरह से यह करने के लिए मिल गया है, लेकिन मैं एक प्रशंसक नहीं हूँ। मैंने एक SQLQuery सेटअप किया है जो डेटा को पढ़ता है और इसे किसी ऑब्जेक्ट पर वापस मैप करता है। यह काम करता है, लेकिन मुझे मैपिंग के माध्यम से ऐसा करना अच्छा लगेगा। क्या यह भी संभव है क्योंकि डेटाबेस से "मान" मैं मैपिंग कर रहा हूं, उप-चयन है और संपादन योग्य नहीं है?

समाधान:

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

धन्यवाद, एम

उत्तर

7

:

डिएगो से टिप के लिए धन्यवाद, यह अंतिम समाधान मैंने पाया (मेरी ClassMap फ़ाइल में धाराप्रवाह NHibernate, का उपयोग करते हुए) था आप अपनी संपत्ति के लिए formula के रूप में चयन खंड निर्दिष्ट कर सकते हैं।