EF মাইগ্রেশনস: রোলব্যাক শেষবার প্রয়োগিত স্থানান্তরিত হয়েছে?


434

এটি দেখতে দেখতে একটি সাধারণ কাজ বলে মনে হচ্ছে তবে এটি করার সহজ উপায় আমি খুঁজে পাচ্ছি না।

আমি সর্বশেষ প্রয়োগকৃত স্থানান্তর পূর্বাবস্থায় ফেরাতে চাই। আমি একটি সাধারণ কমান্ড আশা করতাম, যেমন

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 হিসাবে, আপনি যে পদ্ধতির বর্ণনা করেছেন সেটি হল পছন্দের উপায় way সুতরাং

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

অথবা আপনার উদাহরণ স্থানান্তর ব্যবহার করে

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

একটি সমাধান হ'ল একটি মোড়ক PS স্ক্রিপ্ট তৈরি করা হবে যা উপরের পদক্ষেপগুলিকে স্বয়ংক্রিয় করে তোলে। তদ্ব্যতীত, এটির জন্য একটি বৈশিষ্ট্য অনুরোধ তৈরি করতে নির্দ্বিধায় বা আরও ভাল, এটি বাস্তবায়নে শট নিন! https://github.com/dotnet/ef6


4
আরেকটি বিশদ: আপনার যদি কোনও বিদ্যমান ম্যানুয়াল মাইগ্রেশন থাকে তবে আপনাকে আবার রোল করতে হবে, তবে বুঝতে পেরেছেন যে আপনার "ডাউন" পদ্ধতিটি জিনিসগুলিকে যথাযথভাবে পিছনে রোল করে না, আপনি কেবল এটি সম্পাদনা করতে এবং সংরক্ষণ করতে পারেন, তারপরে আপডেট-ডাটাবেস -তারেটর পুনরায় চালু করুন .. যতক্ষণ না এটি সঠিকভাবে পিছনে যায়। ম্যানুয়াল মাইগ্রেশনকে সত্যিকারের পরে সংশোধন করা - আপনি ইতিমধ্যে এটি প্রয়োগ করার পরে - এটিকে এমন কিছুতে পরিণত করবেন না যা সম্পাদনা করার অনুমতি নেই।
ক্রিস মোসচিনি

1
এটি আমার পক্ষে কাজ করে না। সকল আমি পান "নিদিষ্ট লক্ষ্য মাইগ্রেশন" -1 "এর অস্তিত্ব নেই করা হয়।
tutiplain

2
@ টটিপ্লেইন তার দ্বিতীয় কোড ব্লকটি দেখুন। আপনি যা চান তার অস্তিত্ব উদ্ধৃত করে, যা বিদ্যমান তা নয়।
সিঞ্জাই

ডটনেট কমান্ড ব্যবহার করে এটি করার সঠিক উপায় কী? দুঃখিত, আমি নথিতে সন্ধান করতে পারি না বা আমি কিছু অনুপস্থিত। ইন্টিফ্রেমে ওয়ার্কটিউটোরিয়াল.এন.এফ.কমোর / দিয়ে কোন পরামর্শ দেওয়ার চেষ্টা করেছেন ?
সিজন শ্রেষ্ঠ

আমি সমাধানটি পেয়েছি dotnet ef database update LastGoodMigration, তবে এটি বিভ্রান্তিকর বলে মনে হচ্ছে যেহেতু আমি নোড পটভূমি থেকে আসছি এবং কন্টেক্স, সিকুলাইজ ব্যবহার করছি, তাদের সর্বশেষ পরিবর্তনটি ফিরিয়ে আনার জন্য একটি আদেশ রয়েছে, ডাটাবেসটিতে প্রয়োগ হওয়া শেষ ক্রিয়াকে ফিরিয়ে দেওয়ার কোনও আদেশ আছে কি? ?
সিজন শ্রেষ্ঠ

415

আমি এই থ্রেডটিতে কিছু স্পষ্টতা যুক্ত করতে চাই:

Update-Database -TargetMigration:"name_of_migration"

আপনি উপরে যা করছেন তা বলছে যে আপনি নির্দিষ্ট স্থানান্তরিত হওয়া অবধি আপনার সমস্ত মাইগ্রেশন রোলব্যাক করতে চান। সুতরাং, আপনি যদি জেট-মাইগ্রেশন ব্যবহার করেন এবং আপনি যদি দেখতে পান যে আপনার কাছে এ, বি, সি, ডি এবং ই রয়েছে, তবে এই কমান্ডটি ব্যবহার করে আপনাকে E এবং D রোলব্যাক করবে সি:

Update-Database -TargetMigration:"C"

এছাড়াও, যদি না কেউ বিপরীতে মন্তব্য করতে না পারে, আমি লক্ষ্য করেছি যে আপনি একটি মূল মান এবং সংক্ষিপ্ত-টার্গেট সুইচ ব্যবহার করতে পারেন (এইভাবে,-টার্গেটটি-টার্গেটমাইগ্রেশন হিসাবে একই)। আপনি যদি সমস্ত মাইগ্রেশন রোলব্যাক করতে এবং আবার শুরু করতে চান তবে আপনি ব্যবহার করতে পারেন:

Update-Database -Target:0

0, উপরে, এমনকি প্রথম স্থানান্তরকে রোলব্যাক করবে ( এটি একটি ধ্বংসাত্মক কমান্ড - এটি ব্যবহারের আগে আপনি কী করছেন তা নিশ্চিত হন! ) - আপনি যদি উপরের সিনট্যাক্সটি ব্যবহার করেন তবে এটি করতে পারবেন না যার নাম প্রয়োজন লক্ষ্য মাইগ্রেশন (মাইগ্রেশন প্রয়োগের আগে 0 তম স্থানান্তরের নামটি বিদ্যমান নেই!)। সেক্ষেত্রে আপনাকে 0 (অর্ডিনাল) মানটি ব্যবহার করতে হবে। তেমনিভাবে, আপনি যদি ক, খ, সি, ডি, এবং ই স্থানান্তরিত প্রয়োগ করেন (অর্ডার অনুসারে), তবে অর্ডিনাল 1 এ এর ​​সাথে উল্লেখ করা উচিত, অর্ডিনাল 2 এর বি এবং আরও উল্লেখ করা উচিত। সুতরাং বি তে রোলব্যাক করতে আপনি যে কোনওটি ব্যবহার করতে পারেন:

Update-Database -TargetMigration:"B"

অথবা

Update-Database -TargetMigration:2

অক্টোবর 2019 সম্পাদনা করুন:

অনুরূপ প্রশ্নের সাথে সম্পর্কিত উত্তর অনুসারে , সঠিক কমান্ডটি -TargetEF কোর ১.১ এর জন্য এবং এটি -MigrationEF কোর ২.০ এর জন্য।


27
সূচক 0 সহ মাইগ্রেশনের নাম $InitialDatabase
মেমার্ক

1
ধন্যবাদ। অন্যান্য সূচী অবস্থানগুলি যেমন $ সর্বশেষ ডেটাবেস, বা এর মতো কিছু উল্লেখ করার জন্য কি কোনও $ (নাম) মান আছে?
জাজিমভ

আমি জানি না। আমি সরল গুগলিং করে কোনওটি খুঁজে পাইনি। সম্ভবত EF উত্স কোড ব্রাউজ করা তাদের প্রকাশ করবে?
মেমার্ক

3
এফওয়াইআই, আমরা কেবল ls variable:*এটির মধ্যে দৌড়েছি এবং ওপি হিসাবে একই জিনিস করতে চাইছিলাম ... এটি ব্যবহার করে দেখে মনে $InitialDatabaseহচ্ছে কেবল 0 হিসাবে চিহ্নিত পাওয়ারশেল ভেরিয়েবল, অন্য কোনও সংজ্ঞা নেই, এমনকি বর্তমান EF উত্স কোডেও নেই। এবং,
গমন

1
এটি উত্তর হওয়া উচিত
WtFudgE

75

ইন EntityFrameworkCore :

Update-Database 20161012160749_AddedOrderToCourse

20161012160749_AddedOrderToCourseমাইগ্রেশনের একটি নাম যেখানে আপনি রোলব্যাক করতে চান।


2
জহর! এই উত্তরটি পেতে আমার কিছুটা সময় লেগেছে (তারা এটি নেট। কোর এর জন্য পরিবর্তন করেছে)। অবশ্যই একটি উঁচু মূল্য!
হকিজে

4
আপনার তারিখ / সময় অন্তর্ভুক্ত করার দরকার নেই। আপনি কেবল নাম লিখতে পারেন।
রিচার্ড মার্স্কেল - ড্র্যাকির

1
এটি আমার পক্ষে কাজ করে না ... এটি "সম্পন্ন" বলে দেবে তবে আমি যেটি নির্দিষ্ট করেছি তার পরে সমস্ত স্থানান্তর এখনও রয়ে গেছে। এবং এই স্থানান্তরের কোনওটিতে "ডাউন" কোডটির কোনওটিই কার্যকর করা হয়নি।
egmfrs

যে কোনও একটি নির্দিষ্ট মাইগ্রেশনে ফিরে যেতে পারে: আপডেট-ডাটাবেস-মাইগ্রেশন: "যুক্তডোর্ডারটোকোর্স" বিশেষত যখন মাইগ্রেশন নামে ফাঁকা ব্যবহার করা হয়, এটি করার উপায় এটি। (অর্থাত্ আপডেট-ডাটাবেস-অভিবাসন "কোর্সে অর্ডার যুক্ত করা হয়েছে")
সুইস কোডার

13

সমাধানটি হ'ল:

Update-Database TargetMigration 201609261919239_yourLastMigrationSucess

10
এটি ইতিমধ্যে প্রশ্নে বলা হয়েছে, প্রশ্নকর্তা এটি ইতিমধ্যে জানতেন। আমি দেখতে পাচ্ছি না এটি কীভাবে সহায়তা করে, সম্ভবত আপনি আরও পরিষ্কার করে দিতে পারেন?
এনিভেস

এই উত্তর আরও সংক্ষিপ্ত। টিওয়াই ম্যাক্স!
andreikashin

4

অতিরিক্ত অনুস্মারক:

আপনার যদি একাধিক কনফিগারেশন প্রকার থাকে তবে আপনার [কনফিগারেশননাম] নির্দিষ্ট করতে হবে

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

3

Remove-Migrationআপনার ভুল মাইগ্রেশন যুক্ত করার পরে আপনি ইএফ কোরে প্যাকেজ ম্যানেজার কনসোলে কমান্ডটি প্রবেশ করতে পারেন ।

কনসোলটি আপনাকে পরামর্শ দেয় যদি আপনার মাইগ্রেশনে ডেটা ক্ষতি জড়িত হতে পারে:

একটি অপারেশন ভারা হয়ে গিয়েছিল যার ফলে ডেটা হারাতে পারে। নির্ভুলতার জন্য মাইগ্রেশনটি পর্যালোচনা করুন। এই ক্রিয়াটি পূর্বাবস্থায় ফেলার জন্য, সরান-স্থানান্তর ব্যবহার করুন।


3
update-database 0

সতর্কতা : এটিইএফসিওরে সমস্ত মাইগ্রেশনফিরিয়েআনবে! যত্ন সহকারে ব্যবহার করুন :)


2

আমি দেখতে পেলাম যে প্যাকেজ ম্যানেজার কনসোলে রান করার সময় এটি কাজ করে:

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

আপনি এমন স্ক্রিপ্ট তৈরি করতে পারেন যা এটি সহজ করে তোলে।


1

আমি এন্টিফ্রেমওয়ার্ককোর ব্যবহার করছি এবং আমি উত্তরটি উত্তর @ ম্যাসিজেলিসকেকে ব্যবহার করি। আপনার যদি একাধিক ডিবি প্রসঙ্গ থাকে তবে আপনার প্রসঙ্গের পরামিতি যুক্ত করে প্রসঙ্গটি নির্দিষ্ট করতে হবে যেমন:

Update-Database 201207211340509_MyMigration -context myDBcontext

( 201207211340509_MyMigrationআপনি যে মাইগ্রেশনটি আবার রোল করতে চান তা কোথায় এবং myDBcontextআপনার ডিবি প্রসঙ্গের নাম)



0

যদি ড্যাটালাসের সম্ভাবনা থাকে তবে ডিফল্টরূপে অটোমেটিক মাইগ্রেশনডাটা লসএলয়েড = মিথ্যা, এবং অ্যাকশনটি রোলব্যাক করে না যদি আপনি ডালটালস ইএফ আপডেট-ডাটাবেস কমান্ডটি সম্পন্ন না করেন তবে আপনি এটি প্রয়োগ না করে -ফরফ প্যারামিটার দিয়ে চালাবেন না ।

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

অথবা

Update-Database TargetMigration:Your_Migration_Index -force
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.