2009-07-14 14 views
5

निम्नलिखित सरल सी # वर्ग पर विचार करें:नई इकाई को सहेजते समय NHibernate डेटाबेस-डिफ़ॉल्ट मान का उपयोग कैसे कर सकता है?

public class Entity 
{ 
    public Entity() { } 
    public virtual int Id { get; private set; } 
    public virtual DateTime DateCreated { get; private set; } 
} 

निम्नलिखित सरल NHibernate मैपिंग के साथ मैप किया गया:

<class name="Entity" mutable="false"> 
    <id name="Id"> 
     <generator class="native"> 
    </id> 
    <property name="DateCreated"/> 
</class> 

निम्न सरल डेटाबेस स्कीमा के लिए:

CREATE TABLE Entity (
    Id int IDENTITY(1,1) PRIMARY KEY, 
    DateCreated datetime NOT NULL DEFAULT getUtcDate() 
) 

जब कोई नया उदाहरण बनाते हैं Entity और डेटाबेस को सहेजते हुए, आप DateCreated कॉलम के लिए डेटाबेस के डिफ़ॉल्ट मान का उपयोग करने के लिए NHibernate को कैसे निर्देश देते हैं यदि इसका मान null है? वैकल्पिक रूप से, मैं कैसे निर्दिष्ट कर सकता हूं कि एनएचबीर्नेट को getUtcDate() फ़ंक्शन के परिणाम का उपयोग प्रविष्टि पर DateCreated फ़ील्ड के मान के रूप में करना चाहिए?

जबकि मैं आसानी से

DateCreated = DateTime.Now; 

को एंटिटी कन्स्ट्रक्टर में जोड़ सकता हूं, यह एप्लिकेशन सर्वर की स्थानीय घड़ी का उपयोग कर रहा है, और मुझे डेटाबेस की स्थानीय घड़ी का उपयोग स्थिरता सुनिश्चित करने के लिए करना होगा जब प्रत्येक एप्लिकेशन एकाधिक सर्वर हो उनके संभावित गैर सिंक्रनाइज़ स्थानीय घड़ियों।

+0

nhibernate सवाल का जवाब नहीं कर सकते हैं, लेकिन सामान्य रूप में आप यूटीसी के रूप में अपने डेटाबेस में दिनांक स्टोर करने के लिए चाहता हूँ। इससे कोई फर्क नहीं पड़ता कि उनका स्रोत क्या है, यूटीसी सभी सर्वरों में समान है (मानते हुए घड़ियों सटीक हैं)। –

+0

सामान्य रूप से, हाँ, सहमत हो गया। यही कारण है कि मैंने प्रश्न में getDate() के बजाय getUtcDate() निर्दिष्ट किया। :) – iammichael

उत्तर

4

आप निर्दिष्ट कर सकते है कि संपत्ति डेटाबेस से उत्पन्न होता है:

NHibernate Mapping - property

तो अपने मामले के लिए आप निर्दिष्ट करना चाहते हैं:

generated="insert" 

इस तरह NHibernate एक सम्मिलित करें के बाद जानता है कि यह इकाई को रीफ्रेश करना होगा, लेकिन अपडेट के बाद डेटक्रेटेड नहीं बदला जाएगा।

आप यह भी निर्दिष्ट करने के लिए हो सकता है:

update="false" insert="false" 

मैं कभी नहीं उत्पन्न का उपयोग किया है, और मुझे यकीन है कि अगर NHibernate उन स्थापित करने के लिए लाने का प्रयास या आप इसे स्पष्ट रूप से क्या करना है नहीं कर रहा हूँ।

+0

यह सुनिश्चित नहीं है कि दस्तावेज़ों में मुझे कैसे याद आया (http://nhforge.org/doc/nh/en/index.html#mapping- जनरेटेड); मैं कसम खाता हूं कि मैंने कम से कम दो बार देखा और उस पर सही दिखना चाहिए। – iammichael

+0

मुझे आपके डॉक्टर लिंक बेहतर पसंद हैं। मुझे एनएच फोर्ज को नियमित रोकना शुरू करना होगा। – anonymous

+0

दुर्भाग्य से यह पूरी तरह से सवाल का जवाब नहीं देता है। हालांकि यह आवेषण के लिए काम करता है, अपडेट के लिए आपको डेटाबेस ट्रिगर्स को नियोजित करने की आवश्यकता होगी। एनएचबीर्नेट अभी भी यूडीएपीएटी के हिस्से के रूप में "डेफॉल्ट" या "GETUTCDATE()" नहीं भेजता है। –

1

मुझे एक समान समस्या थी। मुझे अपनी कक्षा मैपिंग में विशेषता dynamic-insert="true" जोड़ना पड़ा।
प्रलेखन से:

dynamic-insert (optional - defaults to false): specifies that INSERT SQL should be generated at runtime and contain only the columns whose values are not null. 
संबंधित मुद्दे