इकाई-फ्रेमवर्क माइग्रेशन रीसेट करें


299

मैंने अपने माइग्रेशन IgnoreChangesको मिटा दिया है , मैंने शुरुआती माइग्रेशन का उपयोग किया है , लेकिन अब मैं अपने सभी माइग्रेशन को हटाना चाहता हूं और सभी लॉजिक के साथ शुरुआती माइग्रेशन को शुरू करना चाहता हूं।

जब मैं फ़ोल्डर में माइग्रेशन हटाता हूं और कोशिश करता हूं और Add-Migration करता यह एक पूर्ण फ़ाइल उत्पन्न नहीं करता है (यह खाली है - क्योंकि मैंने अपने पिछले के बाद से कोई बदलाव नहीं किया है, लेकिन अब हटा दिया गया है, माइग्रेशन)।

क्या कोई डिसएबल-माइग्रेशन कमांड है, इसलिए मैं पुन: चला सकता हूं Enable-Migrations?



3
एक महत्वपूर्ण नोट यदि आपके पास कई कनेक्शन हैं: निर्दिष्ट करें कि कौन सा उपयोग करें जब आप माइग्रेशन रीसेट करते हैं, अन्यथा यह उन दोनों पर लागू करने का प्रयास करेगा जिनके कारण विसंगतियां होने पर समस्या हो सकती है।
जीरो वेनवेल

नोट: यदि आपने अपना माइग्रेशन नहीं हटाया था (आप संस्करण नियंत्रण का सही उपयोग करते हैं?), तो आप अपने db को अपडेट कर सकते हैं-यदि आपने पहले माइग्रेशन किया था तो शमन हटा दिया था और उस बिंदु से नए माइग्रेशन बनाए थे। यहां देखें: stackoverflow.com/a/23793384/309634
डार्सीटॉमस

जवाबों:


446

आपको :

  1. राज्य को हटाएं: अपने प्रोजेक्ट में माइग्रेशन फ़ोल्डर हटाएं; तथा
  2. __MigrationHistoryअपने डेटाबेस में तालिका को हटाएं (सिस्टम टेबल के तहत हो सकता है); फिर
  3. पैकेज कमांड कंसोल में निम्न कमांड चलाएँ:

    Enable-Migrations -EnableAutomaticMigrations -Force

    के साथ या बिना उपयोग करें -EnableAutomaticMigrations

  4. और अंत में, आप चला सकते हैं:

    Add-Migration Initial

5
^ ^ यह पता लगाया - यह एक टीएफएस त्रुटि थी - यदि आप टीएफएस का उपयोग कर रहे हैं, तो आपको "सक्षम-माइग्रेशन ..." कमांड चलाने से पहले चेक-इन करने की आवश्यकता है। : D
BrainSlugs83

7
यदि आप संस्करण नियंत्रण का उपयोग नहीं कर रहे हैं, तो हटाने से पहले अपने बीज मानों को बचा लें!
रयान जेएमसीजीवन

77
@RyanJMcGowan यदि आप संस्करण नियंत्रण का उपयोग नहीं कर रहे हैं, तो आप अपना काम खोने के लायक हैं। :-)
माइक कोल

4
@Tood। उसको +1। मुझे बहुत समय बचाया। अब अगर केवल EF टीम ही वह सब रीसेट-माइग्रेशन कमांड में शामिल कर सकती है। शायद EF 6 ...
जेराल्ड डेविस

24
किसी मौजूदा डेटाबेस के लिए, आपको "अप" फ़ंक्शन की सामग्री पर टिप्पणी करने की आवश्यकता है। जब आप "अपडेट-डेटाबेस" चलाते हैं, तो आपको एक त्रुटि मिलेगी, यह शिकायत करेगा कि तालिका पहले से मौजूद है
गाइ

149

मुद्दा: आपने अपने माइग्रेशन को समाप्त कर दिया है और आप अपनी मौजूदा तालिकाओं को हटाए बिना इसे रीसेट करना चाहेंगे।

समस्या: आप डेटाबेस में मौजूदा तालिकाओं के साथ माइग्रेशन रीसेट नहीं कर सकते क्योंकि EF खरोंच से तालिकाएँ बनाना चाहता है।

क्या करें:

  1. Migrations_History तालिका से मौजूदा माइग्रेशन हटाएं।

  2. माइग्रेशन फ़ोल्डर से मौजूदा माइग्रेशन हटाएं।

  3. ऐड-माइग्रेशन रीसेट चलाएँ। यह आपके माइग्रेशन फ़ोल्डर में एक माइग्रेशन बनाएगा जिसमें टेबल्स बनाना शामिल है (लेकिन यह इसे नहीं चलाएगा इसलिए यह त्रुटि नहीं करेगा।)

  4. अब आपको माइग्रेशनहिस्टर टेबल में प्रारंभिक पंक्ति बनाने की आवश्यकता है ताकि ईएफ में वर्तमान स्थिति का एक स्नैपशॉट हो। यदि आप माइग्रेशन लागू करते हैं, तो EF ऐसा करेगा। हालाँकि, आप उस माइग्रेशन को लागू नहीं कर सकते जो आपने अभी-अभी किया है क्योंकि टेबल आपके डेटाबेस में पहले से मौजूद हैं। इसलिए माइग्रेशन में जाएं और "अप" विधि के अंदर सभी कोड को कमेंट करें।

  5. अब अपडेट-डेटाबेस चलाएं। यह माइग्रेशन को लागू करेगा (जबकि वास्तव में डेटाबेस नहीं बदल रहा है) और माइग्रेशनहिस्टर में एक स्नैपशॉट पंक्ति बनाएगा।

आपने अब अपने माइग्रेशन रीसेट कर दिए हैं और सामान्य माइग्रेशन के साथ जारी रह सकते हैं।


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

2
यह भी जवाब है कि अधिक लचीला है। मेरे मामले में कुछ बदलाव थे जिन्हें मुझे लागू करने की आवश्यकता थी और कुछ अन्य को नहीं। मैं सिर्फ अपने ऊपर () में उपयोगी सामान रख सकता है।
tec-goblin

1
@ एच। जॉनसन, मैंने इसे देखा है। क्या आपके पास इसके बारे में कोई प्रश्न है?
ग्रेग गम

2
EF 6.0 से ज्ञात होने वाली एक बात _MigrationsHistory टेबल में कई DBContexts के लिए माइग्रेशन हैं। इसे हटाने से समस्याएँ हो सकती हैं, आपको केवल उन पंक्तियों को हटाना चाहिए जहाँ ContextKey = आपका माइग्रेशन नाम है। 2 से ऊपर के बाद भी मुझे फिर से सक्षम होना पड़ा
डेविड वाटरवर्थ

2
अनिवार्य रूप से एक ही जवाब, एक विस्तारित उदाहरण के साथ (स्क्रीनशॉट के साथ): weblog.west-wind.com/posts/2016/Jan/13/…
nmit026

30

कैसा रहेगा

Update-Database TargetMigration: $InitialDatabase

पैकेज प्रबंधक कंसोल में? यह सभी अपडेट को अपनी प्रारंभिक अवस्था में रीसेट कर देना चाहिए।

संदर्भ लिंक: कोड प्रथम माइग्रेशन - एक विशिष्ट संस्करण में माइग्रेट करना (डाउनग्रेड सहित)


मुझे लगता है कि मेरी मुख्य हताशा अब राज्य को सही ढंग से बनाए रखने के लिए पलायन पर भरोसा नहीं कर रही थी। और परिणामस्वरूप खरोंच से शुरू करना चाहते हैं।
टोड

@ टोड, मैं साथ में ठोकर खाई और यह हमेशा स्पष्ट नहीं था कि क्या मुझे सभी शुरू करने के लिए माइग्रेशन फ़ाइलों को हटा देना चाहिए। अब यह निम्नलिखित काम कर रहा है: 1. "अपडेट-डेटाबेस -टार्गेट माइग्रेशन: $ आरंभिक डीडीबेस" का उपयोग करके प्रारंभिक पर वापस लौटें। 2. सभी माइग्रेशन फ़ाइलों को निकालें (yyyyMMddHHmmssx_Name.cs या .vb का उपयोग करके नाम) 3. 'ऐड-माइग्रेशन -Name some_name' का उपयोग करके अद्यतन को ताज़ा करें। 4. 'अपडेट-डेटाबेस' का उपयोग करके अपने डेटाबेस को प्रभावित करने के लिए अपडेट जारी करें। आशा है कि यह आप के लिए काम करता है।
क्रिस वून

मेरे मामले में, इस उत्तर में सुझाई गई कमांड SQL त्रुटियों के कारण हुई।
जस्टिन स्किल्स

इसका क्या मतलब होना चाहिए "InitialDatabase"? क्या यह डीबी में पहले से बनाए गए टेबल या कॉलम को हटा देगा?
सर्ज

16

इसे ठीक करने के लिए, आपको निम्न करने की आवश्यकता है:

  1. माइग्रेशन फ़ोल्डर में सभी * .cs फ़ाइलें हटाएँ।

  2. डेटाबेस में _MigrationHistory तालिका हटाएं

  3. Daud Enable-Migrations -EnableAutomaticMigrations -Force

  4. Daud Add-Migration Reset

फिर, public partial class Reset : DbMigrationकक्षा में, आपको सभी मौजूदा और मौजूदा टेबल्स पर टिप्पणी करने की आवश्यकता है:

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

यदि आप इस बिट को याद करते हैं तो सभी विफल हो जाएंगे और आपको फिर से शुरू करना होगा!

  1. अब दौड़ो Update-Database -verbose

यह सफल होना चाहिए अगर आपने ऊपर सही ढंग से किया है, और अब आप सामान्य रूप से आगे बढ़ सकते हैं।


2
सब कुछ टिप्पणी करने के बजाय, आप बस "वापसी" भी लिख सकते हैं। विधि की पहली पंक्ति में ()।
चेनस्टेयर

6

यह देखते हुए कि जब हम .NET कोर में EF की खोज करते हैं तब भी यह दिखाता है, मैं अपना उत्तर यहाँ पोस्ट करूँगा (क्योंकि इसने मुझे बहुत परेशान किया है)। ध्यान दें कि EF 6 .NET संस्करण के साथ कुछ सूक्ष्मताएं हैं (कोई प्रारंभिक आदेश नहीं है, और आपको "स्नैपशॉट" फ़ाइलों को हटाना होगा)

(.NET कोर 2.1 में परीक्षण किया गया)

यहाँ कदम हैं:

  1. _efmigrationhistoryतालिका हटाएं ।
  2. अपने संपूर्ण समाधान के लिए उन फ़ाइलों के लिए खोजें, जिनमें स्नैपशॉट उनके नाम से है, जैसे कि ApplicationDbContextSnapshot.cs, और उन्हें हटा दें।
  3. अपने समाधान का पुनर्निर्माण करें
  4. Daud Add-Migration InitialMigration

कृपया ध्यान दें: आपको सभी स्नैपशॉट फ़ाइलों को हटाना होगा । मैंने डेटाबेस को डिलीट किए हुए अनगिनत घंटे बिताए हैं ... यदि आप ऐसा नहीं करते हैं तो यह खाली माइग्रेशन उत्पन्न करेगा।

इसके अलावा, # 3 में आप अपने प्रवास को केवल नाम दे सकते हैं लेकिन आप जो चाहते हैं।

यहाँ कुछ अतिरिक्त संसाधन दिए गए हैं: asp.net कोर माइग्रेशन खाली उत्पन्न

इकाई फ्रेमवर्क 7 माइग्रेशन को रीसेट करें


3

EntityFramework 6 में कृपया प्रयास करें:

Add-Migration Initial

प्रारंभिक माइग्रेशन फ़ाइल को अपडेट करने के लिए।


3

इकाई फ्रेमवर्क कोर में।

  1. माइग्रेशन फ़ोल्डर से सभी फ़ाइलों को निकालें।
  2. कंसोल में टाइप करें

डॉटनेट ef डेटाबेस ड्रॉप -f -v

डॉटनेट एफई माइग्रेशन आरंभ में जोड़ता है

डॉटनेट ef डेटाबेस अपडेट


2

मेरी समस्या यह है कि मैंने मैन्युअल रूप से माइग्रेशन फ़ोल्डर निकाल दिया है। मैंने ऐसा इसलिए किया क्योंकि मैं सामग्री का बैक अप लेना चाहता था, इसलिए मैंने केवल फ़ोल्डर को प्रोजेक्ट से बाहर खींच लिया। मैंने बाद में इसे वापस डालकर (बैकअप प्रतिलिपि बनाने के बाद) समस्या को ठीक किया, फिर माइग्रेशन फ़ोल्डर को समाधान एक्सप्लोरर में राइट-क्लिक करके हटा दिया और पॉपअप मेनू से हटाएं चुनें।


1

ईएफ 6 में

  1. 'माइग्रेशन' फ़ोल्डर में अपनी सभी फ़ाइलें हटाएं ... लेकिन 'आरंभिक निर्माण' या 'कॉन्फ़िगरेशन' नहीं।
  2. डेटाबेस हटाएँ।
  3. अब दौड़ो Add-Migration Initial
  4. अब आप 'अपडेट-डेटाबेस' कर सकते हैं और सब ठीक हो जाएगा।

1

हटाएँMigrations फ़ोल्डर,Clean तो Rebuildपरियोजना। इसने मेरे लिए काम किया। क्लीन एंड रिबिल्ड से पहले यह कह रहा था कि माइग्रेशन अपनी कैश्ड मेमोरी में पहले से मौजूद है, इसे अभी तक डिलीट नहीं किया गया है।


0

इस पद्धति में __MigrationHistoryतालिका को हटाने की आवश्यकता नहीं होती है , इसलिए आपको अपने हाथों को डेटाबेस पर रखने की आवश्यकता नहीं है।

  1. माइग्रेशन फ़ोल्डर से मौजूदा माइग्रेशन हटाएं।
  2. पैकेज मैनेजर कंसोल में चलाते हैं Add-Migration ResetMigrations
  3. Up()विधि में स्वच्छ प्रवास का इतिहास :
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
    public override void Up()
    {
        Sql("DELETE FROM [dbo].[__MigrationHistory]");
    }

    public override void Down()
    {
    }
}

0

नेट कोर 3.0 में:

मुझे रिसेट माइग्रेशन का रास्ता नहीं मिल रहा था ।

मैं भी टूटे हुए पलायन के साथ समस्याओं में भाग गया, और यहां दिए गए उत्तर मेरे लिए काम नहीं करते थे। मेरे पास एक .Net कोर 3.0 वेब एपीआई है, और कहीं न कहीं पिछले महीने मैंने सीधे डेटाबेस को संपादित किया। हां, मैंने बुरा, बुरा किया।

यहां सुझाई गई रणनीतियों के परिणामस्वरूप पैकेज मैनेजर कंसोल में कई त्रुटियां हुईं:

  • उस नाम का माइग्रेशन पहले से मौजूद है
  • स्नैपशॉट नहीं मिल सका
  • 'फोर्स' एक मान्यता प्राप्त पैरामीटर नहीं है

दी, मैं एक कदम चूक गया या सही फ़ाइलों को साफ करने से चूक सकता हूं, लेकिन मैंने पाया कि इसको साफ करने के तरीके उतने ही क्रूर तरीके से हैं:

  • प्रत्येक माइग्रेशन के लिए PMC से निकालें-माइग्रेशन, नाम के निर्माण के रिवर्स ऑर्डर में, टूटे हुए माइग्रेशन को शामिल और शामिल करें
  • नया माइग्रेशन बनाने के लिए ऐड-माइग्रेशन जो वर्तमान स्कीमा तक अंतिम अच्छे माइग्रेशन के बीच डेल्टा होगा

अब जब वेब एपीआई को खाली डेटाबेस के साथ शुरू किया जाता है, तो यह सही ढंग से इकाई मॉडल से मेल खाने के लिए सभी तालिकाओं और गुणों को बनाता है।

HTH!



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.