EF माइग्रेशन: रोलबैक अंतिम लागू माइग्रेशन?


435

यह वास्तव में एक सामान्य कार्य की तरह दिखता है, लेकिन मुझे इसे करने का एक आसान तरीका नहीं मिला।

मैं अंतिम लागू प्रवास को पूर्ववत करना चाहता हूं। मुझे एक साधारण कमांड की उम्मीद होगी, जैसे

PM> Update-Database -TargetMigration:"-1"

इसके बजाय, मैं सभी के साथ आ सकता हूं:

PM> Get-Migrations

Retrieving migrations that have been applied to the target database.
201208012131302_Add-SystemCategory
201207311827468_CategoryIdIsLong
201207232247409_AutomaticMigration
201207211340509_AutomaticMigration
201207200025294_InitialCreate

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

(कम से कम मैं सिर्फ नाम का उपयोग कर सकता हूं, टाइमस्टैम्प को लंघन कर सकता हूं ...)

क्या कोई आसान तरीका है?


1
दुःख की बात है कि यहाँ हम वर्षों बाद हैं और कोई भी वास्तव में प्रश्न नहीं पढ़ता है।
डैनियल जेडए

जवाबों:


160

EF 5.0 के अनुसार, आपके द्वारा वर्णित दृष्टिकोण पसंदीदा तरीका है। इसलिए

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

या अपने उदाहरण पलायन का उपयोग कर

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

एक उपाय यह होगा कि एक रैपर PS स्क्रिप्ट तैयार की जाए जो ऊपर दिए गए चरणों को स्वचालित बनाती है। इसके अतिरिक्त, इसके लिए एक सुविधा अनुरोध बनाने के लिए स्वतंत्र महसूस करें, या बेहतर अभी तक, इसे लागू करने पर एक शॉट लें! https://github.com/dotnet/ef6


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

1
यह मेरे लिए काम नहीं करता है। मेरे पास "निर्दिष्ट लक्ष्य माइग्रेशन" -1 है, मौजूद नहीं है।
tutiplain

2
@tutiplain उसके दूसरे कोड ब्लॉक को देखें। आप उद्धृत करते हैं कि वह क्या चाहता है अस्तित्व में है, न कि क्या मौजूद है।
सिंजई

डॉटनेट कमांड का उपयोग करने का सही तरीका क्या है? क्षमा करें, मैं दस्तावेज़ में नहीं मिला या मुझे कुछ याद नहीं है। Unitframeworktutorial.net/efcore/… के माध्यम से कोई सुझाव दिया?
सिजन श्रेष्ठ

dotnet ef database update LastGoodMigrationहालाँकि, मुझे इसका हल मिल गया , हालाँकि यह भ्रामक लगता है क्योंकि मैं एक नोड बैकग्राउंड से आ रहा हूँ और नक्स का उपयोग कर रहा हूँ, sequlize, उनके पास अंतिम परिवर्तन को वापस लाने की आज्ञा है, क्या डेटाबेस पर लागू की गई अंतिम क्रिया को वापस करने का कोई आदेश है। ?
सिजन श्रेष्ठ

415

मैं इस थ्रेड में कुछ स्पष्टीकरण जोड़ना चाहता हूं:

Update-Database -TargetMigration:"name_of_migration"

आप जो ऊपर कर रहे हैं वह कह रहा है कि आप उन सभी माइग्रेशनों को रोलबैक करना चाहते हैं, जिन्हें आप निर्दिष्ट माइग्रेशन के साथ छोड़ रहे हैं। इस प्रकार, यदि आप GET-MIGRATIONS का उपयोग करते हैं और आप पाते हैं कि आपके पास A, B, C, D, और E हैं, तो इस कमांड का उपयोग करने से E और D आपको C पर ले जाएंगे।

Update-Database -TargetMigration:"C"

इसके अलावा, जब तक कोई भी इसके विपरीत टिप्पणी नहीं कर सकता, मैंने देखा कि आप एक आर्डिनल मान और शॉर्ट-टार्गेट स्विच का उपयोग कर सकते हैं (इस प्रकार, -Target वैसा ही है जैसे -TargetMigration)। यदि आप सभी माइग्रेशन को रोलबैक करना चाहते हैं और शुरू करना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

Update-Database -Target:0

0, इसके बाद के संस्करण, यहां तक ​​कि FIRST माइग्रेशन भी रोलबैक होगा ( यह एक विनाशकारी कमांड है - सुनिश्चित करें कि आप जानते हैं कि आप इसका उपयोग करने के बाद आप क्या कर रहे हैं! ) - यदि आप ऊपर दिए गए सिंटैक्स का उपयोग करते हैं तो कुछ ऐसा नहीं कर सकते हैं जिसके लिए आपको नाम की आवश्यकता होती है लक्ष्य माइग्रेशन (माइग्रेशन लागू होने से पहले 0 वें माइग्रेशन का नाम मौजूद नहीं है!)। तो उस स्थिति में, आपको 0 (क्रमिक) मान का उपयोग करना होगा। इसी तरह, यदि आपने ए, बी, सी, डी, और ई (उस क्रम में) में माइग्रेशन लागू किया है, तो ऑर्डिनल को ए को संदर्भित करना चाहिए, ऑर्डिनल 2 को बी को संदर्भित करना चाहिए, और इसी तरह। तो बी को रोलबैक करने के लिए आप या तो उपयोग कर सकते हैं:

Update-Database -TargetMigration:"B"

या

Update-Database -TargetMigration:2

अक्टूबर 2019 को संपादित करें:

एक समान प्रश्न पर इस संबंधित उत्तर के अनुसार , सही कमांड -TargetEF Core 1.1 के लिए है जबकि यह -MigrationEF Core 2.0 के लिए है।


27
इंडेक्स 0 के साथ माइग्रेशन का नाम है $InitialDatabase
मेमोरियल

1
धन्यवाद। क्या अन्य इंडेक्स पदों, जैसे कि $ LatestDatabase, या ऐसा कुछ करने के लिए संदर्भित करने के लिए कोई $ (नाम) मान हैं?
जाजिमोव

मुझे नहीं पता। मैं सरल googling द्वारा कोई भी खोजने में सक्षम नहीं है। शायद ईएफ स्रोत कोड ब्राउज़ करने से उन्हें प्रकट होगा?
मेमोरियल

3
FYI करें, हम बस इसमें भाग गए और ओपी के रूप में एक ही काम करना चाह रहे थे ... ls variable:*इसका उपयोग करना ऐसा लगता है कि $InitialDatabaseयह केवल एक PowerShell चर है जिसे 0 के रूप में परिभाषित किया गया है, वर्तमान EF स्रोत कोड में भी कोई अन्य परिभाषित नहीं है। और, पलायन कुछ भी वापस नहीं करता है, यह केवल सांत्वना के लिए लिखता है, इसलिए आप वस्तुओं पर पुनरावृति नहीं कर सकते ...
DrewJordan

1
इसका उत्तर होना चाहिए
WtFudgE

76

में EntityFrameworkCore :

Update-Database 20161012160749_AddedOrderToCourse

जहाँ 20161012160749_AddedOrderToCourseआप माइग्रेशन करना चाहते हैं, उसका नाम है।


3
जीईएम! इस उत्तर को खोजने में मुझे थोड़ा समय लगा (क्योंकि उन्होंने इसे .NET कोर के लिए बदल दिया है)। निश्चित रूप से एक उत्थान लायक!
हॉकी जेक्ट

4
आपको दिनांक / समय शामिल करने की आवश्यकता नहीं है। आप सिर्फ नाम में डाल सकते हैं।
रिचर्ड मार्स्केल - Drackir

1
यह मेरे लिए काम नहीं करता है ... यह "पूर्ण" कहेगा, लेकिन मेरे द्वारा निर्दिष्ट एक के बाद भी सभी पलायन अभी भी बने हुए हैं। और उनमें से किसी भी माइग्रेशन में "डाउन" कोड में से कोई भी निष्पादित नहीं किया गया है।
egmfrs

कोई भी इस तरह से एक विशिष्ट माइग्रेशन पर वापस चला सकता है: अपडेट-डेटाबेस-माइग्रेशन: "एडऑडरडरकोर्स" विशेष रूप से माइग्रेशन नामों में रिक्त स्थान का उपयोग करते समय, यह ऐसा करने का तरीका है। (यानी अपडेट-डेटाबेस-माइग्रेशन "एडेड ऑर्डर टू कोर्स")
स्विसकोडर

13

समाधान है:

Update-Database TargetMigration 201609261919239_yourLastMigrationSucess

10
यह पहले से ही सवाल में कहा गया है, पूछने वाला पहले से ही यह जानता था। मैं नहीं देखता कि यह कैसे मदद करता है, हो सकता है कि आप इसे स्पष्ट कर सकें?
ANEves

यह उत्तर अधिक संक्षिप्त है। टीआई मैक्स!
andreikashin

4

अतिरिक्त अनुस्मारक:

यदि आपके पास कई कॉन्फ़िगरेशन प्रकार हैं, तो आपको [कॉन्फ़िगरेशननाम] निर्दिष्ट करने की आवश्यकता है

Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]

3

ईएफ कोर में आप Remove-Migrationअपने गलत माइग्रेशन को जोड़ने के बाद पैकेज मैनेजर कंसोल में कमांड दर्ज कर सकते हैं ।

कंसोल आपको सुझाव देता है कि यदि आपका माइग्रेशन डेटा की हानि को शामिल कर सकता है तो आप ऐसा करें:

एक ऑपरेशन को पाड़ दिया गया था जिसके परिणामस्वरूप डेटा का नुकसान हो सकता है। कृपया सटीकता के लिए माइग्रेशन की समीक्षा करें। इस क्रिया को पूर्ववत करने के लिए, निकालें-माइग्रेशन का उपयोग करें।


3
update-database 0

चेतावनी : यहEFCore में सभी माइग्रेशन कोवापस रोल करेगा! कृपया देखभाल के साथ उपयोग करें :)


2

मैंने पाया कि पैकेज मैनेजर कंसोल में चलने पर यह काम करता है:

dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }

आप एक स्क्रिप्ट बना सकते हैं जो इसे आसान बनाती है।


1

मैं EntityFrameworkCore का उपयोग कर रहा हूं और मैं @MaciejLisCK द्वारा उत्तर का उपयोग करता हूं। यदि आपके पास कई DB संदर्भ हैं, तो आपको संदर्भ पैरामीटर को जोड़कर संदर्भ निर्दिष्ट करने की आवश्यकता होगी जैसे:

Update-Database 201207211340509_MyMigration -context myDBcontext

( 201207211340509_MyMigrationवह माइग्रेशन कहां है जिसे आप वापस रोल करना चाहते हैं, और myDBcontextआपके DB संदर्भ का नाम है)



0

मामले में dataloss एफई के लिए एक संभावना है जब तक आप इसके साथ चलाने AutomaticMigrationDataLossAllowed के बाद से अद्यतन-डेटाबेस आदेश = डिफ़ॉल्ट रूप से गलत, roolbacks क्रिया को पूरा नहीं करता है -Force पैरामीटर।

Update-Database TargetMigration:"Your migration name" -force

या

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