EF कोर के साथ ASP.NET कोर में एक माइग्रेशन को अनपेक्षित रूप से कैसे करें


179

जब मैं PM> Remove-Migration -context BloggingContextVS2015 में ASP.NET कोर प्रोजेक्ट के साथ EF Core का उपयोग करके चलाता हूं तो मुझे निम्नलिखित त्रुटि मिलती है:

System.InvalidOperationException: The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.    at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.RemoveMigration(String contextType, Boolean force) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsRemoveCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
 The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

मैं इसे कैसे अनपेक्षित कर सकता हूं? मैं ASP.NET कोर 1.0, EF कोर और VS2015 अपडेट 3 की नवीनतम रिलीज का उपयोग कर रहा हूं।


3
-forceअंत में जोड़ने का प्रयास करें
भावी

1
लेख learnentityframeworkcore.com/migrations#reversing-a-migration चरणों का वर्णन करता है। लिंक के लिए धन्यवाद @drewskis
माइकल फ्रीजिम

धन्यवाद @MichaelFreidgeim
ड्रूस्किस

जवाबों:


215

उपयोग:

CLI

> dotnet ef database update <previous-migration-name>

पैकेज मैनेजर कंसोल

PM> Update-Database <previous-migration-name>

उदाहरण:

PM> Update-Database MyInitialMigration

फिर अंतिम माइग्रेशन निकालने का प्रयास करें।

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

PMC का उपयोग करते समय, प्रयास करें: PM> अपडेट-डेटाबेस 0 यह डेटाबेस को मिटा देगा और आपको उसके समाधान पर माइग्रेशन स्नैपशॉट को निकालने की अनुमति देगा


6
मुझे अभी भी वही त्रुटि मिल रही है। मैंने पहली बार dotnet ef database update MyFirstMigration --context BloggingContextउस काम को सफलतापूर्वक किया। फिर मैंने भाग लिया dotnet ef migrations remove --context BloggingContextकि मुझे मेरी पोस्ट में उसी तरह का त्रुटि संदेश दिया गया है
nam

14
आपको माइग्रेशन से पहले अपडेट करना होगा MyFirstMigration। यदि वह 1 माइग्रेशन है (जैसा कि नाम से पता चलता है) तो आप dotnet ef database update 0डेटाबेस से सभी माइग्रेशन को वापस (अनपेक्षित रूप से) उपयोग कर सकते हैं । फिर आपको दौड़ने में सक्षम होना चाहिए dotnet ef migrations remove
bvpb

इसके अलावा यह ध्यान देने योग्य है कि आपको केवल दिनांक-उपसर्ग को छोड़कर प्रवास के नाम का उपयोग करना चाहिए
संरचित

2
इसके dotnet ef migrations removeबाद कॉल करें
Chamika Sandamal

आपका दूसरा कथन: "फिर अंतिम प्रवास को हटाने का प्रयास करें" इस उत्तर में पूर्ण नहीं है, कृपया ठीक वही बताएं जो आपका मतलब है। माइग्रेशन फ़ाइल निकालें? एक कमांड निष्पादित करें? ...
एस। सेरपोशन

125

सभी माइग्रेशन को पूरी तरह से हटाने और सभी को फिर से शुरू करने के लिए, निम्नलिखित करें:

dotnet ef database update 0
dotnet ef migrations remove

1
लेकिन आप सभी पलायन को दूर नहीं करना चाहते हैं। उदाहरण के लिए, आप डेटा \ माइग्रेशन फ़ोल्डर के तहत पहचान (उपयोगकर्ता खाते) के लिए डिफ़ॉल्ट माइग्रेशन VS बनाता है।
nam

यह जानना अच्छा है dotnet ef database update 0, लेकिन dotnet ef migrations removeबाद में चलना पहचान के लिए डिफ़ॉल्ट माइग्रेशन को हटा देगा, जो कि वांछित नहीं हो सकता है।
किंबौड़ी 19

टिप के लिए धन्यवाद dotnet ef database update 0! मैंने इसका उल्लेख कहीं नहीं देखा था ...
तोबियस जे

3
@nam "लेकिन आप सभी माइग्रेशन नहीं निकालना चाहते हैं।" लेकिन हममें से कुछ करते हैं। यह मत
मानो

3
यह मेरे लिए काम नहीं किया। पहली लाइन ठीक थी और सभी माइग्रेशन को हटा दिया, दूसरी लाइन पर मुझे अभी भी मिलता हैThe migration '20180618103514_InitialMigration' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
पक्षी रैन

52

आप अभी भी Update-Databaseकमांड का उपयोग कर सकते हैं ।

Update-Database -Migration <migration name> -Context <context name>

हालाँकि, आपके माइग्रेशन के नाम को देखते हुए, यह मानते हुए कि यह पहला माइग्रेशन है, ताकि कमांड काम न करे। आपको __MigrationHistoryअपने डेटाबेस में तालिका से प्रविष्टि को हटाने में सक्षम होना चाहिए और फिर Remove-Migrationकमांड को फिर से चलाना चाहिए। आप माइग्रेशन फ़ाइल भी हटा सकते हैं और बस फिर से शुरू कर सकते हैं।


आप Update-Databaseपैकेज प्रबंधन कंसोल से कॉल कर सकते हैं या dotnet ef database updateप्रोजेक्ट डायरेक्टरी से कमांड प्रॉम्प्ट से कॉल कर सकते हैं ।
किंबौड़ी

6
बस यहां ब्रैड के उत्तर को स्पष्ट करने के लिए - <migration name>उस प्रवास का नाम होना चाहिए जिसे आप वापस जाना चाहते हैं (यानी शायद आपके द्वारा खराब किए जाने से पहले का प्रवास ), न कि उस प्रवास का नाम जिसे आप पूर्ववत करना चाहते हैं।
मार्क अमेरी

52

किसी विशिष्ट माइग्रेशन को अनपेक्षित रूप से करने के लिए :

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

सभी माइग्रेशन को अनपेक्षित करने के लिए :

dotnet ef database update 0
or
PM> Update-Database -Migration 0

अंतिम माइग्रेशन निकालने के लिए:

dotnet ef migrations remove
or
PM> Remove-Migration

सभी माइग्रेशन निकालने के लिए:

बस Migrationsफ़ोल्डर निकालें ।

पिछले कुछ माइग्रेशन (सभी नहीं) निकालने के लिए:

पलायन का एक समूह हटाने की कोई आज्ञा नहीं है और हम इन कुछ migrationsऔर उनकी *.designer.csफाइलों को हटा नहीं सकते हैं क्योंकि हमें स्नैपशॉट फ़ाइल को सुसंगत स्थिति में रखने की आवश्यकता है। हमें एक-एक करके माइग्रेशन निकालने होंगे ( To remove last migrationऊपर देखें )।

अंतिम माइग्रेशन को अनपेक्षित और निकालने के लिए:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force

मैं unapplyइन सभी पदों पर शब्द देखता रहता हूं । यह सिर्फ मुझे मारा यह एक तकनीकी शब्द नहीं है, यह शब्द हैun - apply
हेलजेट

28

अंतिम लागू माइग्रेशन को वापस करने के लिए आपको (पैकेज मैनेजर कंसोल कमांड) चाहिए:

  1. डेटाबेस से माइग्रेशन वापस करें: PM> Update-Database <prior-migration-name>
  2. प्रोजेक्ट से माइग्रेशन फ़ाइल निकालें (या इसे अगले चरण पर फिर से लागू किया जाएगा)
  3. अपडेट मॉडल स्नैपशॉट: PM> Remove-Migration

UPD : दृश्य स्टूडियो (2017) के नवीनतम संस्करणों में दूसरे चरण की आवश्यकता नहीं लगती है।


1
धन्यवाद! यह पूरी तरह से काम करता है कि सभी समाधानों में से किसी ने कभी भी चरण 2 की आवश्यकता का उल्लेख नहीं किया है
माइकल कार्गल

हां, किसी ने भी चरण दो का उल्लेख नहीं किया है। धन्यवाद
अजु

दूसरे चरण के बारे में निश्चित नहीं है, मेरे मामले में (नवीनतम VS2017) माइग्रेशन फ़ाइल Remove-Migrationसमस्या के बिना कॉल करने के बाद स्वचालित रूप से हटा दी जाएगी । मुझे यकीन नहीं है कि आपने क्या कहा था "इसे अगले चरण पर फिर से लागू किया जाएगा"!
एस। सेरपोशन

@ S.Serpooshan वास्तव में। मैंने इसे मैन्युअल रूप से डिलीट कर दिया था, लेकिन जब मैंने रिमूवल-माइग्रेशन चलाया तो यह मेरे पिछले माइग्रेशन के बारे में शिकायत करता था जो डेटाबेस पर लागू होता था। लेकिन, यह काम करता है।
मेटलमीक्टर

दूसरा चरण मुझे लगता है कि केवल तभी आवश्यक है जब आप dbContext.Database.Migrate()अपने
स्टार्टअप

23

बस आप मूल्य द्वारा प्रवासन को लक्षित कर सकते हैं

 Update-Database -Migration:0

फिर आगे बढ़ें और इसे हटा दें

 Remove-Migration

1
यह मेरे लिए काम करता है, लेकिन मैं VSF7 के साथ EF और .NET कोर 2.0 का उपयोग कर रहा हूं
जेम्स मॉरिसन

2
बाहर देखें: - माइग्रेशन: 0 का मतलब है कि बिना किसी माइग्रेशन के राज्य में वापस जाना। यह आपके डेटाबेस को साफ़ करेगा
किरेन जॉनस्टोन

हां पूछे गए सवाल के अनुसार। आप उस मूल्य को
बढ़ा

11

डेटाबेस में पहले से ही लागू होने के बाद सबसे अधिक (हाल ही में) प्रवास को "अनपेक्षित" करने के लिए:

  1. SQL सर्वर ऑब्जेक्ट एक्सप्लोरर खोलें (देखें -> "SQL सर्वर ऑब्जेक्ट एक्सप्लोरर")
  2. उस डेटाबेस में नेविगेट करें जो आपकी परियोजना से जुड़ा हुआ है ताकि छोटे त्रिभुजों को किनारे पर विस्तारित किया जा सके।
  3. "टेबल्स" का विस्तार करें
  4. "Dbo._EFMigrationsHistory" नाम की तालिका खोजें।
  5. दृश्य स्टूडियो में तालिका प्रविष्टियों को देखने के लिए उस पर राइट क्लिक करें और "व्यू डेटा" चुनें।
  6. अपने माइग्रेशन से संबंधित पंक्ति को हटा दें जिसे आप अनपेक्षित रूप से कहना चाहते हैं (संकेत दिए जाने पर "हां" कहें)।
  7. "Dotnet ef माइग्रेशन निकालें" को फिर से कमांड विंडो में डायरेक्टरी में रखें, जिसमें project.json फाइल हो। वैकल्पिक रूप से, पैकेज प्रबंधक कंसोल में "निकालें-माइग्रेशन" कमांड चलाएं।

आशा है कि यह मदद करता है और परियोजना में किसी भी माइग्रेशन पर लागू होता है ... मैंने इसे केवल सबसे हालिया प्रवास के लिए परीक्षण किया ...

हैप्पी कोडिंग!


21
यह वास्तव में माइग्रेशन को संयुक्त राष्ट्र में लागू नहीं करेगा, बस रूपरेखा "सोचें" इसे लागू नहीं किया गया है। यदि आप ऐसा करते हैं तो आपका डेटाबेस असंगत स्थिति में होगा।
mark.monteiro

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

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

10

उपयोगी लिंक, सवाल का एक टिप्पणी होना चाहिए
माइकल फ्रीजिम

यह वही है जो आप .NET कोर में उपयोग करना चाहते हैं
Zac

10

आपको '_EFMigrationsHistory' तालिका से माइग्रेशन '20160703192724_MyFirstMigration' रिकॉर्ड हटाना चाहिए ।

अन्यथा यह कमांड माइग्रेशन को हटा देगा और माइग्रेशन फ़ोल्डर को हटा देगा:

   > remove-migration -force

7

सामान्य तौर पर यदि आप पैकेज मैनेजर कंसोल का उपयोग कर रहे हैं तो माइग्रेशन के नाम को संदर्भित करके एक विशिष्ट माइग्रेशन को हटाने का सही तरीका है

Update-Database -Migration {Name of Migration} -Context {context}

डॉक्स के अनुसार आपके द्वारा लागू किए गए अंतिम माइग्रेशन को हटाने का एक और तरीका है कमांड का उपयोग करना:

dotnet ef migrations remove

इस कमांड को आपकी समाधान निर्देशिका के अंदर डेवलपर कमांड प्रॉम्प्ट (कमांड प्रॉम्प्ट को कैसे खोलें ) से निष्पादित किया जाना चाहिए ।

उदाहरण के लिए यदि आपका एप्लिकेशन "एप्लिकेशन" नाम के अंदर है और फ़ोल्डर c: \ Projects में है। तो आपका रास्ता यह होना चाहिए:

C:\Projects\Application

1
सवाल यह था कि क्या करना है अगर `
डॉटनेट एईएफ

2

EF Core 1.0 में किसी माइग्रेशन को अनपेक्षित रूप से करने के लिए कमांड का उपयोग करें:

डॉटनेट ef डेटाबेस अपडेट {mig_name}

माइग्रेशन के माइग्रेशन नाम का उपयोग करें जब तक कि आप अपने परिवर्तनों को संरक्षित नहीं करना चाहते। माइग्रेशन के नामों की सूची का उपयोग कर पाया जा सकता है:

डॉटनेट ef माइग्रेशन सूची


2

उन सभी माइग्रेशन को वापस करने के लिए जो डीबी पर लागू होते हैं बस चलते हैं:

update-database 0

इसे Remove-Migrationकई बार चलाने के साथ पालन किया जाना चाहिए क्योंकि माइग्रेशन डायरेक्टरी में माइग्रेशन फाइल्स दिखाई देती हैं। आदेश नवीनतम माइग्रेशन को हटाता है और स्नैपशॉट को भी अपडेट करता है।



0
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManaget = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

await context.Database.EnsureDeletedAsync();

-1

1.find तालिका "dbo._EFMigrationsHistory", फिर उस माइग्रेशन रिकॉर्ड को हटा दें जिसे आप निकालना चाहते हैं। 2. पीएम (पैकेज मैनेजर कंसोल) में "रिमूव-माइग्रेशन" चलाएं। मेरे लिये कार्य करता है।


यह डेटाबेस के एक असंगत स्थिति की ओर ले जाएगा (जैसे एक स्तंभ पहले से ही गिरा हुआ है)
UNeverNo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.