2009-06-15 5 views
8

तो, नौसिखिया NHibernate उपयोगकर्ता; इसके चारों ओर अपने दिमाग लपेटने की कोशिश कर रहा है।क्या एनबीबर्ननेट जांच सकता है कि डीबी स्कीमा उत्पन्न हुआ है या नहीं?

मैं इस बात पर विचार कर रहा हूं कि तैनाती को कैसे संभालना है, और बाद में वेब ऐप में ऐड-ऑन का इंजेक्शन (जिसे अपनी खुद की दृढ़ता कक्षाओं की आवश्यकता हो सकती है)।

मैं सोच रहा था कि तैनाती के लिए SchemaExport का उपयोग करना बहुत अच्छा काम करेगा, लेकिन मैं सोच रहा था कि एनएचबीर्नेट को मुझे एक सामान्य, कोड-आधारित तरीके से बताने के लिए कोई तरीका है कि एक स्कीमा निर्यात पहले से ही किया गया है, या नहीं। मूल रूप से, मैं इस स्यूडोकोड में तरह smething क्या करना चाहते हैं:

if(!_cfg.HasSchemaForType(typeof(MyType)) 
     ExportSchema(typeof(MyType)); 
    else 
     UpdateSchema(typeof(MyType)); 

जहां दो कार्य आंतरिक SchemaExport या SchemaUpdate क्रमश का प्रयोग करेंगे।


संपादित करें: दोस्तों, मैं अभी तक उत्तर की सराहना करता हूं, लेकिन वे थोड़ा सा बिंदु खो रहे हैं। जो मैं स्थापित करने की कोशिश कर रहा हूं वह एप्लिकेशन के लिए ऐड-ऑन को जोड़ने और हटाने की अनुमति देने का एक तरीका है जिसके लिए डीबी में परिवर्तन की आवश्यकता हो सकती है। मैं अपने कोड या जैसे संस्करण (कम से कम, इसके प्राथमिक कार्य के रूप में नहीं) के संस्करण के बारे में बात नहीं कर रहा हूं। इसलिए जब मैं ऐप को तैनात करता हूं, और जब मैं प्लग-इन जोड़ता या निकालता हूं तो सवाल कम होता है। क्या थीस प्लगइन (इसलिए छद्म कोड प्रकार की जांच) पहले तैनात किया गया है? यदि ऐसा है, तो अद्यतन चलाएं। यदि नहीं, तो निर्यात चलाएं। सही बात?

उत्तर

3

नहीं, NHibernate जो भी आप पूछ रहे हैं वह नहीं करता है। मुझे लगता है कि स्कीमा को निर्यात करने वाले कुछ कोड लिखना संभव होगा और फिर इसे डेटाबेस स्कीमा से तुलना की जाएगी। लेकिन शायद एक अस्थायी डेटाबेस में निर्यात करना आसान होगा और स्कीमा की तुलना करने के लिए एक तृतीय पक्ष टूल का उपयोग करें, जैसे कि Redgate SQL तुलना करें।

भले ही आप जो भी पूछ रहे हों, मैंने यह नहीं देखा कि इससे तैनाती में मदद मिलेगी क्योंकि इसका उद्देश्य स्क्रैच से डेटाबेस बनाना है।

संपादित जोड़ने के लिए: प्रत्येक प्लगइन मान लिया जाये कि टेबल के अपने स्वयं के सेट है, तो आप यह समझ सकते हैं अगर स्कीमा कई तरीकों में से एक का उपयोग कर तैनात किया गया है: प्लगइन वस्तुओं में से एक लोड और पकड़ने के लिए

  • प्रयास अपवाद।
  • तालिका स्कीमा (SQL सर्वर के लिए एसएमओ का उपयोग करके) जांचें कि यह जांचने के लिए कि तालिकाएं मौजूद हैं या नहीं।
  • प्लगइन तैनात होने पर एक तालिका में एक रिकॉर्ड बनाएं।
+1

ऐप को तैनात करने की समस्या को हल करने की कोशिश नहीं कर रहा है। मैंने स्पष्टीकरण के लिए कुछ अतिरिक्त नोट्स जोड़े। आपके प्रतिक्रिया के लिए धन्येवाद! – Paul

+0

मुझे नहीं लगता कि उसका मतलब समय पर तैनाती है ... इसे रन टाइम या प्रारंभिक समय पर होना होगा ... प्लग इन को अपनी निर्भरताओं के लिए ज़िम्मेदार होना होगा। – Webjedi

+0

धन्यवाद; मैंने आपका जवाब 'उत्तर दिया' के रूप में चिह्नित किया क्योंकि यह सबसे पूरा था। मुझे लगता है कि एक अलग चिंता है जो ट्रैक करता है कि कौन से प्लगइन तैनात किए गए हैं शायद यह आपके लिए सबसे अच्छा मार्ग है, जैसा कि आप अपने तीसरे बुलेट में सुझाव देते हैं। – Paul

0

यदि आपके पास वीएस टीम सूट या डेटाबेस डेवलपर संस्करण है, तो यह परिवर्तनों को सिंक और ट्रैक कर सकता है और फिर एक तैनाती स्क्रिप्ट बना सकता है जो आपके लिए सभी सही वस्तुएं तैयार करेगा। इसके अलावा रेडगेट में स्कीमा उत्पाद की तुलना करता है जो वही काम करता है यदि मुझे गलत नहीं लगता है।

+0

मेरे पास वीएस का न तो संस्करण है, लेकिन मैं इसे डेवलपर स्तर पर प्रबंधित करने की कोशिश नहीं कर रहा हूं; इरादा एक फ़ील्ड ऐप बनाने का है कि व्यवस्थापक प्लगइन जोड़/हटा सकते हैं। – Paul

2

स्कीमा निर्यात का उद्देश्य स्क्रैच से पूरी स्कीमा उत्पन्न करना है। वास्तव में उपयोगी अगर आपने अभी तक अपना आवेदन तैनात नहीं किया है।

पहली तैनाती के बाद मैं एक माइग्रेशन टूल का उपयोग करने की अत्यधिक अनुशंसा करता हूं जो आपको स्कीमा के आगे एक्सटेंशन/संशोधनों के साथ मदद करेगा। यदि आप थोड़ा और आगे सोचते हैं तो आपको पता चलेगा कि आपको डेटा मैनिपुलेशन की आवश्यकता है (उदाहरण के लिए गलत डेटा को हटा देना जो कि बग के कारण उत्पन्न हुआ है) क्योंकि आपका एप्लिकेशन विकसित होता है। यह सब एक माइग्रेशन टूल आपकी मदद कर सकता है।

:

यहाँ .net के लिए और अधिक माइग्रेशन उपकरण एक ऐसा प्रश्न का उत्तर की एक सूची है:

में एक नजर डालें

उत्पत्ति रूबी पर रूबी से उत्पन्न माइग्रेशन का एक विचार और अतीत में अन्य ढांचे में "क्लोन" किया गया है। यही कारण है कि मूल विचार के बारे में http://guides.rubyonrails.org/migrations.html पर भी पढ़ना निश्चित रूप से अच्छा है।

+0

ठीक है, मुझे SchemaExport और SchemaUpdate के बीच का अंतर पता है; यही कारण है कि मैं यह पता लगाने में सक्षम होना चाहता था कि प्रारंभिक लिपि पहले ही चल चुकी है या नहीं। – Paul

16

मुझे लगता है कि आप जो देख रहे हैं SchemaUpdate.ExecuteSchemaExport का उपयोग करने के बजाय। SchemaUpdate स्कीमा बनाएगा यदि यह पहले से मौजूद नहीं है, या आवश्यक और वांछित होने पर इसे अपडेट करें।

यह एमएसएसएलएल और एसक्यूएलएइट दोनों का उपयोग करके मेरे लिए काम करता है।

new SchemaUpdate(config).Execute(false, true); 
9

हाँ वहाँ है, कम से कम 3.0

public static bool ValidateSchema() 
{ 
    NHibernate.Tool.hbm2ddl.SchemaValidator myvalidator = new NHibernate.Tool.hbm2ddl.SchemaValidator(m_cfg); 
    try 
    { 
     myvalidator.Validate(); 
     myvalidator = null; 
     return true; 
    } 
    catch (Exception ex) 
    { 
     MsgBox(ex.Message, "Schema validation error"); 
    } 
    finally 
    { 
     myvalidator = null; 
    } 

    return false; 
} 

अद्यतन भाग के लिए में, करते हैं।

public static void UpdateSchema() 
{ 
    NHibernate.Tool.hbm2ddl.SchemaUpdate schema = new NHibernate.Tool.hbm2ddl.SchemaUpdate(m_cfg); 
    schema.Execute(false, true); 
    schema = null; 
} // UpdateSchema 
संबंधित मुद्दे

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