9

मैं डीबी माइग्रेशन के लिए निम्नलिखित CLI का उपयोग के लिए परिवर्तन का पता लगाने:डॉटनैट एफई माइग्रेशन स्वचालन: माइग्रेशन

  1. dotnet ef migrations add <Name-of-Migration>
  2. dotnet ef database update

हालांकि, मैं ऐसा करने का एक तरीका रहा हूँ स्वचालित रूप से: जब मॉडल में कोई परिवर्तन पता चला है।

अब तक, मैं Startup.cs में निम्न कार्य करके चरण 2 को खत्म करने में सक्षम हैं:

private void SetupDatabase(IApplicationBuilder app) 
    { 
     using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope()) 
     { 
      var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); 
      //Migate any pending changes: 
      context.Database.Migrate(); 
     } 
    } 

यह कर रही द्वारा बनाई गई किसी भी लंबित परिवर्तन माइग्रेट करती है: dotnet ef migrations add <Name-of-Migration> लेकिन इसके लिए पलायन नहीं जोड़ता है मॉडल में कोई बदलाव। मैं इसे migrations add कैसे स्वचालित करूं?

+0

हम्म, इसके बाद। – user3581203

+0

पिछले संस्करण किसी कारण से किसी स्क्रिप्ट के माध्यम से नहीं चलाया जा सकता था (कम से कम अनदेखा परिवर्तन के साथ) –

+0

ईएफ 7 में कम से कम माइग्रेशन उत्पन्न करने के लिए संभव नहीं है (पिछले ईएफ 6 में हमने देखा नहीं है)। मुझे लगता है कि ईएफ टीम द्वारा लिया गया एक डिजाइन निर्णय है और जो समझ में आता है आईएमओ। – Hassan

उत्तर

11

अपडेट किया गया: कोड से स्वचालित रूप से माइग्रेशन उत्पन्न करने के पहले चरण को स्थानांतरित करना संभव है, एक डिज़ाइन निर्णय जिसे मैं व्यक्तिगत रूप से सहमत नहीं हूं। इसकी अभी भी अपने लक्ष्य EF7 में संभव नहीं के रूप में मैं मूल रूप से कहा (यह EF7 से हटा दिया गया यह रूप में एक member of Microsoft EF team इवान द्वारा टिप्पणी में उल्लेख किया है ने उल्लेख किया in this SO post के साथ-साथ this blog post पर लगता है), लेकिन मार्टिन जबाब के बाद EF6 में परीक्षण किया गया। दूसरा चरण स्वचालित हो सकता है क्योंकि आप पहले से ही पाए गए हैं इसलिए मैं इसे पुन: पेश नहीं करूंगा। ,

  1. अपनी परियोजना में (जो पहले से ही कुछ मॉडलों के साथ और एक सुसंगत अवस्था में चले होना चाहिए):

    पहला कदम के लिए कदम (EF6 साथ ASP.net MVC वेब अनुप्रयोग में) इस प्रकार हैं पैकेज प्रबंधक कंसोल पर जाएं और Enable-Migrations –EnableAutomaticMigrations चलाएं। यदि आपके एप्लिकेशन में एकल डीबी संदर्भ है, तो उसने वहां भी बदलाव लागू किए हैं।

  2. अब मौजूदा मॉडल पर जाएं और वहां एक नया फ़ील्ड जोड़ें, उदा। public String TestField { get; set; }
  3. के रूप में कोड पहले स्वचालित माइग्रेशन पर हैं, तो आप फिर से Add-Migration आदेश को चलाने के लिए (उम्मीद है कि मैं इस जवाब के बाद के हिस्से में बाहर बिंदु के रूप में,), तो आप सिर्फ Update-Database चलाने की जरूरत नहीं है और डीबी अपने इजाजत दी अद्यतन किया जाना चाहिए ठीक चलाने के लिए आवेदन।

स्वत: मॉडल परिवर्तन निगरानी पैदा करते हैं और अद्यतन डेटाबेस स्वचालित रूप से कभी कभी उल्टी हो सकती है (मेरी विनम्र राय में और MSDN page से) के लिए क्यों:

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

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

स्वचालित माइग्रेशन सक्षम करने पर विचार करने वाले प्रत्येक व्यक्ति को अधिक उदाहरण और कमियों के लिए MSDN page को निश्चित रूप से पढ़ना चाहिए।

+1

* ईएफ 7 के लिए, अगर मुझे कोई रास्ता मिल रहा है (या कोई और करता है), तो इस उत्तर को अपडेट कर देगा। * अपना समय खोज बर्बाद न करें। ईएफ कोर टीम के सदस्य [ब्रिसेलम] द्वारा पोस्ट किया गया [ईएफ कोर माइग्रेशन: डिज़ाइन-टाइम] (http://www.bricelam.net/2014/12/16/ef7-migrations-designtime.html) ब्लॉग पोस्ट पढ़ें (https: //stackoverflow.com/users/475031/bricelam) जो बताता है कि स्वचालित माइग्रेशन ईएफ कोर से क्यों हटा दिए गए हैं। –

6

Entity Framework 4.3 has introduced the Automated Migrations

हालांकि मैं हसन के उत्तर से सहमत हूं कि यह बहुत मुश्किल हो सकता है, यह विकल्प वास्तव में मौजूद है।

  1. जब आप माइग्रेशन सक्षम है, तो आप पैकेज प्रबंधक कंसोल में एक पैरामीटर प्रदान करनी चाहिए:

सक्षम-माइग्रेशन -EnableAutomaticMigration: $ सच

यहाँ एक छोटी फिर से शुरू है

  1. एक कॉन्फ़िगरेशन क्लास automatica होगा lly उत्पन्न:

    public Configuration() 
    { 
        AutomaticMigrationsEnabled = true; 
    
        //Set this parameter to true if you want to let auto-migration delete data when a property is removed from an entity. 
        //Not setting this will result in an exception when migration should remove a column. 
        AutomaticMigrationDataLossAllowed = true; 
    } 
    
  2. Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext, MyConfigurationClass>("MyConnectionString")); 
    

अपने संदर्भ कक्षा में डीबी प्रारंभकर्ता सेट और वहाँ तुम जाओ, अपने मॉडल बदल सकते हैं और परिवर्तन देखने ...

मैं मुझे अभी भी यकीन नहीं है कि मैं इसका उपयोग करूंगा, क्योंकि जब मैं ऐसा कहता हूं तो मेरा डेटाबेस बदलना चाहता है ...

+0

मार्टिन को अच्छा लगा, मैंने इसके बारे में और अधिक पढ़ने के लिए आगे बढ़े और पाया कि एमएसडीएन के पास इसके उदाहरण हैं, हालांकि यह चेतावनियों के साथ आता है कि यह क्षेत्र के नामों में काम नहीं करेगा और टीम के वातावरण में और भी मुद्दे पैदा हो सकते हैं ताकि वे भी इस पर रिले करने के लिए निराश हो गया है। कभी भी विकल्प कम नहीं लगता है। – Hassan

+0

@ हसन क्या आप एमएसडीएन पेज को लिंक कर सकते हैं? मुझे लगता है कि इस उत्तर को बताते हुए इस जवाब पर एक बड़ी हेडर चेतावनी भावी पाठकों के लिए सहायक हो सकती है। –

+0

हां यह आखिरकार मैंने https://msdn.microsoft.com/en-us/library/jj554735%28v=vs.113%29.aspx?f=255&MSPPError=-2147217396 पर अपडेट किया है, मैं अपडेट करने जा रहा हूं मेरा उत्तर जल्द ही अधिक विस्तार से, बस कुछ चीजों का परीक्षण सुनिश्चित करने के लिए। – Hassan

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