2012-05-21 7 views
6

डेटाबेस ORM (DevExpress XPO, NHibernate या MS Entity Framework) का उपयोग कर के उन्नयन के लिए सबसे अच्छा तरीका क्या है?DevExpress XPO बनाम NHibernate इकाई की रूपरेखा बनाम: डेटाबेस उन्नयन मुद्दा

मैं एक नई परियोजना शुरू कर रहा हूं और ORM चुनना है। विकास प्रक्रिया को इंटरमीडिएट टेस्ट को जारी करने की आवश्यकता होती है और अक्सर यह सुनिश्चित होता है कि प्रत्येक बिल्ड में डेटाबेस संरचना में बदलाव आएंगे। प्रत्येक नए संस्करण को वर्तमान डेटा रखने के लिए धीरे-धीरे डीबी को अपग्रेड करना होगा।

वर्ष समाधान के लिए मैं SQL स्क्रिप्ट का एक सेट v2 करने से v1 डेटाबेस के उन्नयन के लिए से v2v3 को प्रदान करेगा, आदि और उन्हें क्रमिक रूप से निष्पादित करें।

लेकिन यह ORM के लिए कैसे काम करेगा? क्या मुझे अभी भी डीबी को अपग्रेड करने के लिए एसक्यूएल स्क्रिप्ट लिखनी चाहिए?

मैं समझता हूं कि नए क्षेत्रों को जोड़ने से कोई समस्या नहीं आती है (उदाहरण के लिए UpdateSchema() method XPO के लिए देखें), लेकिन अगर मुझे तालिका को विभाजित करना है और वर्तमान रिकॉर्ड को दो नई टेबल में पुन: आवंटित करना है?

उत्तर

6

मैं अन्य ORM के पर टिप्पणी नहीं कर सकता, लेकिन मैं 2007 से कॉर्पोरेट ट्रेजरी एप्लिकेशन के लिए DevExpress XPO का उपयोग किया है। स्कीमा प्रत्येक रिलीज के साथ थोड़ा बदलता है लेकिन वर्षों में भी कुछ बड़े स्कीमा परिवर्तन हुए हैं। डिफ़ॉल्ट XPO अपग्रेड तंत्र का कुछ हद तक विस्तारित संस्करण सभी परिवर्तनों के लिए आराम से catered है।

XPO अनुप्रयोगों को अपग्रेड करने के बारे में अच्छी बुनियादी जानकारी here है।

  • देवएक्सप्रेस उत्पादन वातावरण को अपग्रेड करने के कार्य के साथ आपकी सहायता के लिए एक डीबी अपडेटर टूल प्रदान करता है। आप अतिरिक्त आवश्यकताओं को पूरा करने के लिए इस टूल का विस्तार कर सकते हैं। मेरे आवेदन में, हमने लॉगिंग, रोलबैक के साथ पूर्वावलोकन, आदि के लिए कुछ विकल्प जोड़े हैं

  • प्रत्येक मॉड्यूल में वर्चुअल UpdateDatabaseBeforeSchemaUpdate() और UpdateDatabaseAfterSchemaUpdate() विधियां हैं। आप इनके भीतर अपग्रेड प्रक्रिया को महत्वपूर्ण रूप से नियंत्रित कर सकते हैं।

तुम उल्लेख के रूप में, उन्नयन के कुछ XPO द्वारा स्वचालित रूप से नियंत्रित किया जाएगा (जैसे, एक नया स्तंभ जोड़ने), लेकिन कुछ चीजें ऐसी मौजूदा रिकॉर्ड के लिए एक डिफ़ॉल्ट मान के साथ नया स्तंभ initialising के रूप में अतिरिक्त नियंत्रण की जरूरत है।

उदाहरण के लिए, मान लें कि MyNewField को आपके आवेदन के संस्करण 2.0 में MyEntity XPO कक्षा में जोड़ा गया है। मान लें कि मौजूदा रिकॉर्ड के लिए इसे 3 के मान पर डिफ़ॉल्ट होना चाहिए। एक्सपीओ नए कॉलम के निर्माण को संभालेगा लेकिन मौजूदा रिकॉर्ड शून्य होंगे। (यदि आप XPO कक्षा में डिफ़ॉल्ट मान निर्दिष्ट करते हैं तो यह केवल नए रिकॉर्ड से संबंधित होगा)। आदेश मौजूदा रिकॉर्ड के लिए मान को ठीक करने के लिए आपको इकाई मॉड्यूल के ओवरराइड UpdateDatabaseAfterSchemaUpdate() के लिए निम्न की तरह कुछ जोड़ना होगा: (। तुम भी ObjectSpace.GetObjects<MyEntity>() का उपयोग करें और एक foreach सकता है अगर आप सीधे एसक्यूएल से बचने के लिए पसंद करते हैं)

public override void UpdateDatabaseAfterUpdateSchema() 
{ 
    base.UpdateDatabaseAfterUpdateSchema(); 
    if (CurrentDBVersion < new Version(2, 0, 0, 0)) 
     ObjectSpace.GetSession().ExecuteNonQuery(
      "UPDATE [MyEntity] SET [MyNewField] = 3 WHERE [MyNewField] IS NULL"); 
} 

दो में एक तालिका को विभाजित करने के आपके अत्यधिक चरम उदाहरण में, आप एक ही विधि का उपयोग कर सकते हैं, लेकिन आप UpdateDatabaseBeforeUpdateSchema() को ओवरराइड करेंगे, एसक्यूएल को तालिका को विभाजित करने के लिए चलाएं, XPO को किसी भी अन्य स्कीमा अपडेट करने दें और यदि आवश्यक हो, तो किसी भी को पॉप्युलेट करें UpdateDatabaseAfterUpdateSchema() में डिफ़ॉल्ट मान।

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

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

डेवलपर्स को इस बात से अवगत होना चाहिए कि डोमेन मॉडल में परिवर्तन के दौरान अंतर्निहित स्कीमा के साथ समस्या हो सकती है।

परीक्षण के लिए, हम कुछ पुराने ग्राहक डेटाबेस रखते हैं और बिल्ड प्रक्रिया के हिस्से के रूप में परीक्षण के पहले और बाद में परीक्षण का एक गुच्छा चलाते हैं ताकि यह सुनिश्चित किया जा सके कि मौजूदा ग्राहक जो भी संस्करण अपग्रेड कर रहे हैं, ठीक से अपग्रेड कर सकें। उत्पादन में जब भी हम किसी समस्या को अपग्रेड करते हैं, तो भविष्य में समान समस्याओं को रोकने के लिए समस्या डेटा को इस परीक्षण पुस्तकालय में जोड़ा जाता है।

हम प्रमुख अंतरराष्ट्रीय कंपनियों और बैंकों से निपट रहे हैं। परिणाम परिणाम से काफी खुश हैं। ऐसी परिस्थितियों में जहां कॉर्पोरेट के डीबीए को परिवर्तनों पर हस्ताक्षर करने की आवश्यकता होती है, उन्हें लगता है कि स्क्रिप्ट के बजाय अपग्रेड करने के लिए कमांड लाइन उपकरण नहीं है।

+2

आपने जो वर्णन किया है वह एक्सएएफ से संबंधित है, न कि एक्सपीओ विशेष रूप से। – Yuyo

0

अधिकतर माइग्रेशन समाधान नए कॉलम, रिलेशनशिप या एक को हटाने जैसे आसान कार्यों को संभाल सकते हैं, लेकिन जब आप कॉलम का नाम बदलते हैं तो काम करने में विफल रहता है (क्या यह एक जोड़ है या एक नाम के बाद एक निकालना है जो नाम के बराबर है? क्या होना चाहिए आप उस मामले में डेटा के साथ करते हैं?)

सभी तीन समाधानों में मूल माइग्रेशन समर्थन है, XPO आपको प्रक्रिया के एक हिस्से के रूप में अपनी स्क्रिप्ट चलाने देता है (स्थैतिक/परीक्षण/contant डेटा इत्यादि डालने के लिए)

वहाँ भी MigratorDotNet परियोजना है कि आप उपयोग कर सकते हैं और माइग्रेशन के बारे में कोई ORM विशिष्ट सुविधा पर निर्भर नहीं है।

व्यक्तिगत रूप से, मैं केवल dev/test वातावरण में ऑटो माइग्रेशन का उपयोग करता हूं और v1 से v2 में अपग्रेड कहने के लिए क्लाइंट विशिष्ट डेटाबेस पर चलते समय अपग्रेड स्क्रिप्ट का पूरा सेट होगा।

+0

तेज प्रतिक्रिया के लिए धन्यवाद। मैं उन्नयन के लिए एसक्यूएल स्क्रिप्ट उत्पन्न करने के लिए [एपेक्स एसक्यूएल टूल्स] (http://www.apexsql.com) का उपयोग करता हूं। लेकिन मेरी चिंता यह है कि उन्नयन के लिए एसक्यूएल स्क्रिप्ट डेटाबेस प्रकार से ओआरएम की आजादी को मार देती है। –

+0

लेकिन ओआरएम को याद रखना सिर्फ एक और समस्या का समाधान करने के लिए है, जो डेटाबेस से/से पढ़ रहा है। स्कीमा को अपग्रेड करना एक और समस्या है जिसे किसी अन्य टूल द्वारा सबसे अच्छा संभाला जाता है, यह माइग्रेटर.NET या एपेक्स एसक्यूएल टूल्स जैसे बाहरी टूल्स हैं। –

0

यह ओआरएम के लिए कैसे काम करेगा? क्या मुझे अभी भी एसबीएल स्क्रिप्ट को डीबी अपग्रेड करना चाहिए?

इस सवाल प्रोग्रामर stackexchange धागे पर होना चाहिए की स्पष्ट जवाब - What are the criteria for evaluating an ORM for.NET?, वहाँ मैं अपने प्रश्न है कि आप से पूछा और ORM के साथ मेरा अनुभव के साथ मैच के लिए सरल उत्तर मिले, जबकि इकाई की रूपरेखा और कोड स्मिथ ORM टेम्पलेट्स के साथ कुछ परियोजना का विकास ।

ओआरएम डेटा मॉडल में परिवर्तन कैसे प्रबंधित करता है? क्या होगा यदि मुझे एक टेबल विभाजित करना है और वर्तमान रिकॉर्ड को दो नई टेबल में पुन: आवंटित करना है?

कुछ निश्चित मात्रा से भीतर स्वचालित रूप से डीबी अद्यतन कर सकते हैं, अन्य कुछ भी नहीं है और आप गंदे काम खुद करना होगा; अन्य परिवर्तन को संभालने के लिए एक ढांचा प्रदान करता है जो आपको डेटाबेस अद्यतनों को नियंत्रित करने देता है।That means every couple of days किसी मॉडल को अद्यतन करने के लिए एक घंटे खर्च करने के लिए एक मेज जोड़ने के लिए या डेटाटाइप्स कि बदल रहे हैं बदलने की जरूरत

रेफरी:
https://softwareengineering.stackexchange.com/questions/6543/what-are-the-benefits-of-using-database-abstraction-by-orm
https://softwareengineering.stackexchange.com/questions/41739/best-arguments-for-against-introducing-orm-technology-into-a-companies-dev-proce/41833#41833

0

यदि आप पूछते हैं - ओआरएम का उपयोग कर डीबी को अपग्रेड करने का सबसे अच्छा अभ्यास क्या है - मेरा जवाब है: यदि आपका एप्लिकेशन शौकिया ऐप से अधिक है तो इसका उपयोग न करें।

ऐसे कई परिदृश्य हैं जहां कई ओआरएम आपकी विशिष्ट डेटाबेस आवश्यकताओं को समर्थन प्रदान करने में असमर्थ हैं, उदा। संग्रहीत प्रक्रियाओं को बनाने में, एसक्यूएल स्क्रिप्ट लिखने के बिना सूचकांक और विचार या यहां तक ​​कि अनुक्रमित विचार/भौतिकीकृत टेबल बनाएं। मौजूदा तालिका में एक नया गैर-शून्य कॉलम जोड़ने जैसी समस्याएं एसक्यूएल स्क्रिप्ट लिखकर ओआरएम-माइग्रेशन-कोड में हल करना बहुत कठिन है।

विजुअल स्टूडियो डेटा टूल्स जैसे वर्तमान उपकरण इस तरह की समस्याओं को बेहतर तरीके से संभालते हैं।

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