2009-07-20 23 views
11

सहेजने पर गुण सेट करता है मैं अपने डोमेन ऑब्जेक्ट को जारी रखने के लिए डीडीडी और एनएचबेर्नेट का उपयोग कर रहा हूं। मेरे डेटाबेस में किसी इकाई से संबंधित प्रत्येक तालिका में ऑडिट ट्रैकिंग के लिए उपयोग किए गए चार अतिरिक्त कॉलम (बनाया गया, अपडेट किया गया, निर्मितडेट, अपडेटेडडेट) होता है। मैं रिपोजिटरी पैटर्न का उपयोग कर रहा हूं जो केवल कुल जड़ों को सहेजने की अनुमति देता है। जब NHibernate कुल रूट पर इकाइयों को सहेजने का प्रयास करता है, तो मुझे SQL डेटटाइम त्रुटि मिलती है क्योंकि संस्थाओं के पास उनके ऑडिट गुण सेट नहीं होते हैं। क्या एनएचबीर्नेट में सहेजने से पहले ऑब्जेक्ट्स पर गुण सेट करने का कोई तरीका है?NH12ern85 स्वचालित रूप से

यहां एक छोटा सा उदाहरण है। मेरे पास ऑर्डर ऑब्जेक्ट है जो कुल रूट है। मेरे पास ऑर्डर नोट ऑब्जेक्ट भी हैं जो ऑर्डर के बच्चे हैं। जब मैं ऑर्डर में ऑर्डर नोट जोड़ता हूं और फिर आदेश को सहेजता हूं तो अपवाद फेंक दिया जाता है क्योंकि बनाया गयाडेट/अपडेटेडडेट डेटटाइम पर सेट होता है। MinValue जो SQL डेटटाइम ओवरफ़्लो का कारण बनता है। चूंकि ये ऑडिट कॉलम दृढ़ता का हिस्सा हैं और समस्या डोमेन से संबंधित नहीं हैं, इसलिए मैं नोट नहीं जोड़ता जब ऑर्डर कुल रूट इन गुणों को सेट करने के लिए सेट करता है। लेखापरीक्षा कॉलम/गुणों को केवल दृढ़ता ढांचे द्वारा जाना जाना चाहिए, न कि डोमेन। मैं बचत या अद्यतन करते समय इन गुणों को सेट करने के लिए NHibernate को बताने में सक्षम होना चाहता हूं। क्या इसे करने का कोई तरीका है?

उत्तर

11

Interceptors ऐसा कर सकते हैं:

http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-interceptors (9,10, लिंक हमेशा काम नहीं करता)।

कट/पेस्ट दस्तावेज़ से:

public class AuditInterceptor : IInterceptor 
{ 
    ... 

    public boolean OnSave(object entity, 
          object id, 
          object[] state, 
          string[] propertyNames, 
          IType[] types) 
    { 
     if (entity is IAuditable) 
     { 
      for (int i=0; i<propertyNames.Length; i++) 
      { 
       if ("CreateTimestamp" == propertyNames[i]) 
       { 
        state[i] = DateTime.Now; 
        return true; 
       } 
      } 
     } 
     return false; 
    } 

} 

OnFlushDirty() UpdatedDate लिए इस्तेमाल किया जा सकता है।

आप एक ऐसी इंटरफ़ेस को कार्यान्वित करने के लिए एक निर्मितडेट/अपडेटेडडेट की हर इकाई चाहते हैं ताकि इंटरसेप्टर यह जांच सके कि उसे कार्य करना चाहिए या नहीं (प्रदान किए गए उदाहरण में यह IAuditable है)।


संपादित

बस देखा अध्याय 11: Interceptors और घटनाओं। आप EmptyInterceptor से प्राप्त कर सकते हैं जो चीजों को आसान बनाता है अगर आपको केवल कुछ विधियों को ओवरराइड करने की आवश्यकता है।

मैंने कभी भी ईवेंट का उपयोग नहीं किया है।

+0

ग्रेट। यही वही है जो मैं ढूंढ रहा हूं। मैं NHibernate के लिए नया हूं और इस सुविधा से अनजान था। मेरे पास संरक्षित गुणों के साथ लागू एक IAuditable इंटरफ़ेस है, इसलिए डोमेन उन्हें नहीं देख सकता है। – awilinsk

1

आप एनएचबेर्नेट के संस्करण प्रणाली को भी देख सकते हैं, जो आपके मामले में आपकी मदद कर सकता है;)

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