8

पहले साथ EF5 माइग्रेशन चलाने में असमर्थ है, मैं पढ़ा है इन प्रश्न/उत्तर:मौजूदा डेटाबेस

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

  1. मेरा आवेदन मूल रूप से ईएफ 4, मॉडल का उपयोग करके बनाया गया था। मैंने जीयूआई डिजाइनर के साथ अपना डेटाबेस डिज़ाइन किया, और इसका उपयोग अपने डेटाबेस को उत्पन्न करने के लिए किया।
  2. मैं कुछ महीनों के लिए डेटाबेस में डेटा चला रहा हूं और एकत्र कर रहा हूं। मैं वास्तव में यह डेटा खो नहीं सकता।
  3. मैं अपने कोड, NuGet के साथ स्थापित EF5, और इस्तेमाल किया एफई विद्युत उपकरण branched मेरी डेटाबेस से अपने मॉडल एक नया वर्ग पुस्तकालय परियोजना पर राइट-क्लिक करें, और Entity Framework | Reverse engineer code first का चयन करके उत्पन्न करने के लिए।
  4. मैं आसानी से, फिर से संदर्भ के लिए मेरी नई परियोजना के लिए अपने प्रोजेक्ट ObjectContext के बजाय नई DbContext उपयोग करने के लिए परिवर्तित कर रहा था, और कहा कि मेरे पुराने मॉडल आयोजित EF4 वर्ग पुस्तकालय हटा दिया। कार्यक्रम महान काम करता है!

अब, मैं स्वत: माइग्रेशन को आजमाने की कोशिश करता हूं, जिसमें रूबी पर रेल के साथ मेरा थोड़ा सा अनुभव था। यहां मैंने जो किया है:

  1. रण Enable-Migrations। कनेक्शन स्ट्रिंग के कारण कुछ परेशानी थी और कौन सा ऐप.कॉन्फिग इस्तेमाल हो रहा था, लेकिन अंततः इसे मिला। हालांकि, this MSDN page का कहना है कि यह स्वचालित रूप से मुझे बिंदु मैं पहले से ही पर हूँ करने के लिए प्रथम प्रवास उत्पन्न करना चाहिए था। ऐसा नहीं हुआ
  2. Add-Migration InitialSchema Ran पूरा करने के लिए क्या स्वचालित रूप से चरण 1 में नहीं किया गया था यह काम किया।
  3. अपने मॉडल वस्तुओं से एक के लिए एक संपत्ति जोड़ा गया, तो Add-Migration AddSerialToLogEntries चलाने का प्रयास किया, और साथ पेश किया गया:

एक स्पष्ट प्रवास क्योंकि निम्नलिखित स्पष्ट माइग्रेशन लंबित हैं जनरेट करने में असमर्थ: [201307190100268_InitialSchema] । एक नई स्पष्ट प्रवास उत्पन्न करने के लिए प्रयास करने से पहले लंबित स्पष्ट माइग्रेशन लागू करें।

मेरे मौजूदा डेटाबेस पर माइग्रेशन लागू करने का प्रयास विफल रहा, जो आश्चर्यजनक नहीं है।

अन्य उत्तर मैं मूल रूप से ऊपर उल्लेख किया है ने कहा कि मैं भाग्य से बाहर हूँ, लेकिन जैसे मैंने कहा कि उन इकाई की रूपरेखा के पुराने संस्करणों के लिए थे। क्या मेरे पास कोई विकल्प है?

इस प्रश्न को लिखते समय, मैंने सोचा कि मैं एसक्यूएल स्क्रिप्ट में अपना डेटा निर्यात करने के लिए SQL सर्वर प्रबंधन स्टूडियो का उपयोग करने में सक्षम हो सकता हूं, संपूर्ण डेटाबेस हटा सकता हूं, इसे ईएफ बना सकता हूं, फिर स्क्रिप्ट को अपने डेटा को वापस पाने के लिए चलाएं ... मैं उस समय कोशिश करूँगा जब मेरे पास समय होगा, लेकिन मैं यह सुनना चाहूंगा कि क्या अन्य विकल्प हैं क्योंकि मुझे 100% यकीन नहीं है कि काम करेगा और प्रक्रिया में डाले गए डेटा में कोई त्रुटि होने से नफरत होगी।

उत्तर

12

रण सक्षम-माइग्रेशन। कनेक्शन स्ट्रिंग्स और कौन सा ऐप.कॉन्फिग इस्तेमाल हो रहा था, के कारण कुछ परेशानी थी, लेकिन अंततः इसे मिला। हालांकि, यह एमएसडीएन पृष्ठ कहता है कि यह मुझे उस बिंदु पर लाने के लिए स्वचालित रूप से पहला माइग्रेशन उत्पन्न करना चाहिए था जो मैं पहले से ही हूं। ऐसा नहीं हुआ

रण एड-माइग्रेशन InitialSchema को पूरा करने के लिए स्वचालित रूप से चरण 1 में नहीं किया गया था। यह काम किया।

वास्तव में enable-migrations आदेश अपने डेटाबेस पहले से ही से पहले कोड-प्रथम के साथ बनाया गया है केवल अगर एक आरंभिक माइग्रेशन जो मामले में डेटाबेस एक __MigrationHistory तालिका में शामिल है बनाता है

। यदि यह तालिका मौजूद नहीं है (जो मामला है जब आपके पास मौजूदा डेटाबेस है जो कोड-फर्स्ट के साथ पहले कभी नहीं बनाया गया है) enable-migrations केवल Configuration कक्षा बनाता है। पहली माइग्रेशन क्लास बनाने के लिए आपको add-migration मैन्युअल रूप से कॉल करना होगा। तो, आपके द्वारा देखा गया व्यवहार अपेक्षित है। में पैकेज प्रबंधक कंसोल

  • कॉल enable-migrations:

    आम तौर पर प्रक्रिया करता है, तो आप एफई 5 का उपयोग कर रहे तैयार करने के लिए माइग्रेशन के लिए एक मौजूदा डेटाबेस है। आपकी परियोजना में Migrations फ़ोल्डर और Configuration कक्षा बनाई जाएगी।

  • Configuration कक्षा खोलें और निर्माता में AutomaticMigrationsEnabled = false सेट करें (यदि यह पहले से डिफ़ॉल्ट रूप से नहीं है)।

  • पैकेज प्रबंधक कंसोल कॉल

    add-migration -IgnoreChanges InitialSchema 
    

    "InitialSchema" में केवल एक उदाहरण का नाम है। आप इसे जैसे नाम दे सकते हैं। <Timestamp>_InitialSchema कक्षा बनाई जाएगी जो DbMigration से प्राप्त होती है। इस श्रेणी में Up और Down विधियां -IgnoreChanges ध्वज के कारण खाली हैं। इस ध्वज के बिना कक्षा में आपके पूरे मॉडल को डेटाबेस में जोड़ने के लिए माइग्रेशन होगा जो कि आप नहीं चाहते हैं क्योंकि मौजूदा डेटाबेस में पहले से ही डेटाबेस स्कीमा है।

  • पैकेज प्रबंधक कंसोल में update-database चलाएं। चूंकि Up विधि खाली है, इसलिए यह अद्यतन को छोड़कर आपके मौजूदा स्कीमा के साथ कुछ भी नहीं करता है, यह __MigrationHistory तालिका (आपके डेटाबेस में सिस्टम तालिका के रूप में) बनाता है और इस तालिका में पहला रिकॉर्ड जोड़ता है जिसमें आपके वर्तमान ईएफ मॉडल का मॉडल हैश होता है।

  • वैकल्पिक अंतिम चरण: यदि आप स्वचालित माइग्रेशन के साथ काम करना पसंद करते हैं तो Configuration कक्षा खोलें और AutomaticMigrationsEnabled = true को कन्स्ट्रक्टर में सेट करें। यदि आप कोड-आधारित माइग्रेशन के साथ आगे बढ़ना चाहते हैं तो ध्वज false छोड़ दें।

इस बिंदु पर आप अपने मॉडल में बदलाव करना शुरू कर सकते हैं। प्रत्येक बार जब आप add-migration के साथ एक नया माइग्रेशन बनाते हैं तो यह संशोधन से पहले आपके मॉडल पर आधारित होगा और माइग्रेशन क्लास में केवल आवश्यक स्कीमा परिवर्तन होंगे।

+0

ग्रेट, विस्तृत उत्तर। जैसे ही मैं कर सकता हूं मैं आपके कदमों को आजमाउंगा। मुझे पता है कि मैं माइग्रेशन फ़ोल्डर को हटाकर सक्षम-माइग्रेशन को "पूर्ववत" कर सकता हूं, लेकिन क्या मैं इसे हटाने और शुरू करने के बजाय उस पहले माइग्रेशन के ऊपर और नीचे विधियों को भी खाली कर सकता हूं? – Steve

+0

@Steve: हाँ, यह भी काम करना चाहिए। – Slauma

+0

बहुत अच्छा काम किया, धन्यवाद! – Steve

3

मैं एक अलग दृष्टिकोण आप अपने विकास के वातावरण में खरोंच से डेटाबेस बनाने के लिए माइग्रेशन का उपयोग कर सकते हैं जहां कि एक राज्य में आप छोड़ देंगे सुझाव है:

  1. बजाय add-migration -IgnoreChanges InitialSchema बुला, प्राप्त करने की कोशिश काम करने के लिए प्रारंभिक स्कीमा प्रवासन की पीढ़ी। जैसा कि आप कहते हैं, ऐसा तब होना चाहिए जब आपने प्रारंभ में Enable-Migrations कहा था। आप काम करने के लिए एक गैर-मौजूद डेटाबेस पर अपने डेटाबेस कनेक्शन को इंगित करने का प्रयास कर सकते हैं।

  2. इस का एक परिणाम के रूप में, अपने InitialSchema प्रवास के रूप में यह बिंदु पर था, जब आप यह रिवर्स-इंजीनियर डेटाबेस बनाने के लिए तर्क शामिल होंगे। Up() और Down() की सामग्री को तब तक टिप्पणी करने की आवश्यकता है जब तक कि आप सभी वातावरण पर तैनात नहीं हो चुके हैं, जिनके पास पहले से मौजूद एक मौजूदा डेटाबेस है।

  3. तो फिर तुम उन तरीकों की सामग्री और uncomment कर सकते हैं तो पर से, अपने विकास के वातावरण में आप डेटाबेस ड्रॉप कर सकते हैं और

    var migrator = new DbMigrator(new Configuration()); 
    migrator.Update(); 
    

    का उपयोग कर उन्हें पुन: बनाने और आप का पूरा सेट होगा आपके __MigrationHistory तालिका में माइग्रेशन। यह महत्वपूर्ण है क्योंकि इसके बिना आप भविष्य में नए माइग्रेशन जोड़ने में सक्षम नहीं होंगे।

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