2009-02-15 10 views
14

मैं मौजूदा डेटाबेस के साथ NHibernate का उपयोग करने की कोशिश कर रहा हूं। डेटा-मॉडल में प्रत्येक तालिका में कॉलम होते हैं जिसमें पंक्ति में किए गए अंतिम अपडेट का समय और उपयोगकर्ता नाम होता है। मैं NHibernate का उपयोग करके यह कैसे कर सकता हूं?मैं NHibernate का उपयोग करके चेंजटाइम और चेंजयूसर कॉलम को कैसे कार्यान्वित करूं?

मैंने इंटरसेप्टर को कार्यान्वित करने की कोशिश की जो इकाइयों में चेंजटाइम और चेंजयूसर को IInterceptor.OnSave विधि का उपयोग करके सहेजने से पहले सेट करता है। यह काम नहीं करता है क्योंकि इन गुणों को सेट करने से पंक्ति में एक अद्यतन ट्रिगर होता है भले ही कोई अन्य गुण संशोधित नहीं किया गया हो।

यदि एनएचबीर्नेट को चेंजटाइम और चेंजयूसर गुणों को बाहर करने के लिए कहने का कोई तरीका था तो यह काम कर सकता था, तो यह गंदा जांच करता है। लेकिन मुझे इसे पूरा करने का कोई तरीका नहीं मिला है।

किसी भी मदद के लिए धन्यवाद।

उत्तर

14

आपको एक श्रोता को पूर्व डालने और पूर्व अपडेट ईवेंट में पंजीकृत करना चाहिए। तुम इतनी तरह अपने विन्यास के माध्यम से यह कर सकते हैं:

<hibernate-configuration> 
    ... 
    <event type="pre-update"> 
     <listener class="MyListener, MyAssembly"/> 
    </event> 
    <event type="pre-insert"> 
     <listener class="MyListener, MyAssembly"/> 
    </event> 
</hibernate-configuration> 

और उसके बाद एक श्रोता को लागू - कुछ इस तरह (पूरी तरह से सही नहीं हो सकता है - मेरी स्मृति बट्टे खाते में डाल):

public class MyListener : IPreUpdateEventListener, IPreInsertEventListener 
{ 
    public bool OnPreUpdate(PreUpdateEvent evt) 
    { 
     if (evt.Entity is IHasLastModified) 
      UpdateLastModified(evt.State, evt.Persister.PropertyNames); 

     return false; 
    } 

    public bool OnPreInsert(PreInsertEvent evt) 
    { 
     if (evt.Entity is IHasLastModified) 
      UpdateLastModified(evt.State, evt.Persister.PropertyNames); 

     return false; 
    } 

    void UpdateLastModified(object[] state, string[] names) 
    { 
     var index = Array.FindIndex(names, n => n == "LastModified"); 

     state[index] = DateTime.Now; 
    } 
} 

और भी ऐसा ही पूर्व अद्यतन घटना के साथ बात।

संपादित करें: यह सम्मिलित करने के साथ-साथ अद्यतन की देखभाल करता है और ऐसा लगता है।

+0

धन्यवाद! वास्तव में अच्छा जवाब, मुझे बहुत मदद की। यह विधि संस्थाओं के गुणों को संशोधित नहीं करती है, केवल डेटाबेस में जो लिखा जाता है। लेकिन एक ही समय में इकाई के गुणों को सेट करने में कोई समस्या नहीं है। –

+3

इस सटीक समस्या के लिए एक और पूर्ण समाधान के लिए, कृपया http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx – mookid8000

+4

पर एक नज़र डालें, Ayende के ब्लॉग पोस्ट के अनुसार इकाई वस्तु (evt.Entity) और राज्य को अद्यतन करने के लिए आवश्यक है। –

1

Mookid के जवाब सही है, हालांकि मैं कहना है कि अगर एक एस # एआरपी वास्तुकला उपयोग कर रहा है, NHib विन्यास स्थापित किया जाना चाहिए इस प्रकार चाहते हैं:

<hibernate-configuration> 
    <session-factory> 
    ... 
     <event type="pre-update"> 
      <listener class="MyListener, MyAssembly"/> 
     </event> 
     <event type="pre-insert"> 
      <listener class="MyListener, MyAssembly"/> 
     </event> 
    </session-factory> 
</hibernate-configuration> 

घटना तत्वों सत्र में जाने कारखाना तत्व

5

अरे मैं सिर्फ एक परियोजना मैं पर काम कर रहा हूँ पर इस का समाधान करना था, यहाँ मेरा उत्तर

public interface IDateModified 
{ 
    DateTime Created { get; set; } 
    DateTime Modified { get; set; } 
} 

public class CustomDefaultSaveOrUpdateEventListener 
    : DefaultSaveOrUpdateEventListener 
{ 
    protected override object EntityIsPersistent(SaveOrUpdateEvent evt) 
    { 
     var entity = evt.Entity as IDateModified; 
     if (entity != null) 
     { 
       entity.Modified = DateTime.Now; 
     } 

     return base.EntityIsPersistent(evt); 
    } 

    protected override object EntityIsTransient(SaveOrUpdateEvent evt) 
    { 
     var entity = evt.Entity as IDateModified; 
     if (entity != null) 
     { 
      entity.Created = entity.Modified = DateTime.Now; 
     } 

     return base.EntityIsTransient(evt); 
    } 
} 
तब मेरे विन्यास में

है

(मैं कोड में मेरी इकाई परीक्षण कॉन्फ़िगर करने के लिए धाराप्रवाह NHibernate का उपयोग कर रहा)
configuration.EventListeners.SaveOrUpdateEventListeners 
= new ISaveOrUpdateEventListener[] 
{ 
    new CustomDefaultSaveOrUpdateEventListener() 
}; 

AWESOMENESSSSSSSS!

+0

मेरे लिए काम नहीं किया। मैं आपके ब्लॉग पर एक टिप्पणी जोड़ता हूं। – dariol

संबंधित मुद्दे

 संबंधित मुद्दे