সত্তা ফ্রেমওয়ার্ক রোলব্যাক এবং খারাপ স্থানান্তর সরান


174

আমি সি # তে আমার প্রকল্পের জন্য ম্যানুয়াল মাইগ্রেশন এবং আপডেটগুলি সহ EF 6.0 ব্যবহার করছি। ডাটাবেসে আমার প্রায় 5 টি স্থানান্তর রয়েছে, তবে আমি বুঝতে পেরেছিলাম যে শেষ স্থানান্তরটি খারাপ ছিল এবং আমি এটি চাই না। আমি জানি যে আমি আগের মাইগ্রেশনে রোলব্যাক করতে পারি, তবে যখন আমি একটি নতুন (স্থির) মাইগ্রেশন যুক্ত করি এবং আপডেট-ডেটাবেস চালিত করি, তখনও খারাপ স্থানান্তর প্রয়োগ হয়।

আমি আগের মাইগ্রেশনটিতে রোলব্যাক করার চেষ্টা করছিলাম এবং খারাপ মাইগ্রেশন সহ ফাইলটি মুছতে পারি। তারপরে, আমি যখন নতুন মাইগ্রেশন যুক্ত করার চেষ্টা করি তখন ডাটাবেস আপডেট করার সময় আমি ত্রুটি পাই কারণ মাইগ্রেশন ফাইলটি নষ্ট হয়ে গেছে (বিশেষত, কোডের প্রথম লাইনটি টেবিলটি A তে B নাম করে এবং পরবর্তী লাইনগুলি হয়, EF এর সাথে সারণী আপডেট করার চেষ্টা করছে নাম এ - সম্ভবত এটি কিছু EF বাগ)।

আমি কি চালাতে পারি এমন কিছু জিজ্ঞাসা রয়েছে যা EF কে এমন কিছু বলবে যে "শেষের স্থানান্তর যেমন কখনও ছিল না তা ভুলে যাও, এটি খারাপ ছিল")? সরান-স্থানান্তর মত কিছু।

সম্পাদনা 1 আমি আমার পক্ষে উপযুক্ত সমাধান খুঁজে পেয়েছি। মডেলটি ভাল অবস্থানে পরিবর্তন করে রান করুন Add-Migration TheBadMigration -Force। এটি সর্বশেষে প্রয়োগযোগ্য মাইগ্রেশনকে পুনরায় স্ক্যাফোড করবে।

যাইহোক, এটি এখনও মূল প্রশ্নের সম্পূর্ণ উত্তর দেয় না। যদি আমি খারাপ স্থানান্তরে আপডেটডেটব্যাক্স করি তবে খারাপটি বাদ দিয়ে কীভাবে রোলব্যাক করব এবং নতুন মাইগ্রেশন কীভাবে তৈরি করা যায় তার ভাল উপায় খুঁজে পাইনি।

ধন্যবাদ


আমাকে ভিজ্যুয়াল স্টুডিও পুনরায় চালু করতে হয়েছিল এবং তারপরে এটি সঠিকভাবে কাজ শুরু করে। এটি ইতিমধ্যে আমার কাছে বেশ কয়েকবার ঘটেছে, সর্বদা ডেটাবেস আপডেট না করে মাইগ্রেশনের সাথে জড়িয়ে পড়ার পরে, তাই সেখানে টুলিংয়ের সাথে অদ্ভুত কিছু ঘটছে।
Andrei Dvoynos

উত্তর:


167

আপনার কাছে দুটি বিকল্প রয়েছে:

  • আপনি খারাপ স্থানান্তর থেকে ডাউন নিতে পারেন এবং এটি একটি নতুন মাইগ্রেশনতে রাখতে পারেন (আপনার পরবর্তী মডেলটিতে পরিবর্তনগুলিও করতে হবে)। এটি কার্যকরভাবে আরও ভাল সংস্করণে গড়াচ্ছে।

    আমি একাধিক পরিবেশে গিয়েছে এমন জিনিসগুলিতে এই বিকল্পটি ব্যবহার করি।

  • অন্য বিকল্পটি হ'ল Update-Database –TargetMigration: TheLastGoodMigrationআপনার মোতায়েন করা ডাটাবেসের বিরুদ্ধে চালানো এবং তারপরে আপনার সমাধান থেকে মাইগ্রেশন মুছুন। এটি হুল স্ম্যাশ বিকল্পের মতো এবং এটি খারাপ সংস্করণে মোতায়েন করা কোনও ডাটাবেসের বিরুদ্ধে সম্পাদন করা প্রয়োজন।

    দ্রষ্টব্য: আপনি যে মাইগ্রেশনটি ব্যবহার করতে পারেন তা পুনর্বিবেচনা করতে Add-Migration [existingname] -Force। এটি আপনার বিদ্যমান স্থানান্তরকে ওভাররাইট করে দেবে, তাই আপনি যদি ডাটাবেস থেকে বিদ্যমান স্থানান্তর সরিয়ে ফেলে থাকেন তবেই এটি করতে নিশ্চিত হন। এটি বিদ্যমান মাইগ্রেশন ফাইল মোছা এবং চলমান হিসাবে একই কাজ করেadd-migration

    বিকাশের সময় আমি এই বিকল্পটি ব্যবহার করি।


1
হাল্ক স্ম্যাশ বিকল্পটি কাজ করে না। আমি এখনও ডেটাবেজে খারাপ স্থানান্তর প্রয়োগ করি নি। আমি চেষ্টা করেছি, তবে এটি কাজ করছে না, কারণ মূল প্রশ্নের ক্ষেত্রে আমি সারণীর নামগুলি উল্লেখ করেছি। প্রথম বিকল্পটি আমি বেশি পছন্দ করি না, কারণ দেখে মনে হচ্ছে আমাকে স্থানান্তরকরণের কোডটি পরিবর্তন করতে হবে। যদি আমি এটি খারাপভাবে না করি তবে আমি এটি ভেঙে ফেলতে পারি।
মার্টিন ব্র্যাবেক

8
আপনি যদি এখনও খারাপ মাইগ্রেশন প্রয়োগ না করেন তবে এটি মুছে ফেলা এবং ভাঙ্গা স্থানান্তর পুনরূদ্ধার বা সংশোধন করার কোনও কারণ নেই।
পছন্দ

4
'হাল্ক স্ম্যাশ' এর উত্তর, বিকাশকালে এটি আমার পক্ষে কাজ করে এবং আমি যে মাইগ্রেশনটি মিস করেছি তাতে আমি কিছু যুক্ত করতে চাই। আমি মনে করি মার্টিনের জন্য এটি যে কারণে কাজ করে নি সেগুলি সম্পর্কিত নয় (বা সম্ভবত ম্যানুয়ালি ডাটাবেস স্কিমা পরিবর্তন করার সাথে সম্পর্কিত)
rethenhouser2

1
@ বেনারথমিয়ার একটি সাধারণ নিয়ম হিসাবে আমি বিকাশকালে কেবল হাল্ক স্ম্যাশ বিকল্পটি ব্যবহার করি। প্রোড ইন আমি সমস্যাটি সংশোধন করার জন্য সর্বদা একটি নতুন মাইগ্রেশন তৈরি করি। কারণটি হ'ল যদি আপনি ডাটাবেসটি ডাউনগ্রেড করে থাকেন তবে আপনাকে ম্যানুয়াল হস্তক্ষেপের প্রয়োজন। প্রোডে ম্যানুয়াল হস্তক্ষেপের প্রয়োজন এমন কোনও কিছুই আমি পছন্দ করি না।
পছন্দ করেননি

1
HULK SMASH !!!! --- আমি দুর্দান্ত হওয়ার চেষ্টা করেছি কিন্তু ইএফ খেলছে না - আমি শেষ পরিচিত হিসাবে প্রত্যাবর্তন করেছি - (স্থানান্তরিত ফাইলগুলি ব্যাক আপ করা হয়েছে) মুছে ফেলা হয়েছে, যুক্ত করা মাইগ্রেশন - ফোর্স - পূর্বের নামকরণ হয়েছে এবং কোডটি অনুলিপি করেছে। দ্বিতীয় স্থানান্তর একইভাবে - কোনও ত্রুটি নেই - স্বাভাবিক হিসাবে ফিরে যান
ট্রেসি

127

যেহেতু প্রশ্নটি ইঙ্গিত করে এটি বিকাশের ধরণের পরিবেশে মাইগ্রেশনের ক্ষেত্রে প্রযোজ্য যা এখনও প্রকাশ হয়নি।

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

পদক্ষেপ 1: পূর্ববর্তী স্থানান্তর পুনরুদ্ধার করুন

আপনি যদি এখনও নিজের মাইগ্রেশন প্রয়োগ না করেন তবে আপনি এই অংশটি এড়িয়ে যেতে পারেন। পূর্ববর্তী পয়েন্ট ইস্যুতে আপনার ডাটাবেস স্কিমাটি পুনরুদ্ধার করতে -TargetMigration বিকল্প সহ আপডেট-ডাটাবেস কমান্ডটি সর্বশেষ ভাল স্থানান্তর নির্দিষ্ট করে। যদি আপনার সত্তা ফ্রেমওয়ার্ক কোডটি আপনার সমাধানে কোনও আলাদা প্রকল্পে বাস করে, আপনার প্যাকেজ ম্যানেজার কনসোলে '-প্রজেক্ট' বিকল্পটি ব্যবহার করতে বা ডিফল্ট প্রকল্পটি স্যুইচ করতে হতে পারে।

Update-Database TargetMigration: <name of last good migration>

সর্বশেষ ভাল মাইগ্রেশনের নাম পেতে আপনার ডাটাবেসে প্রয়োগ হওয়া মাইগ্রেশন নামের একটি তালিকা পুনরুদ্ধার করতে 'গেট-মাইগ্রেশন' কমান্ডটি ব্যবহার করুন।

PM> Get-Migrations
Retrieving migrations that have been applied to the target database.
201508242303096_Bad_Migration
201508211842590_The_Migration_applied_before_it
201508211440252_And_another

এই তালিকাটি সবচেয়ে সাম্প্রতিক প্রয়োগকৃত স্থানান্তরগুলি প্রথম দেখায়। আপনি যে ডাউনগ্রেড করতে চান তার পরে তালিকায় যে মাইগ্রেশন হয় তা বেছে নিন, যেমন আপনি ডাউনগ্রেড করতে চান তার আগে প্রয়োগ করা হয়েছে। এখন একটি আপডেট-ডাটাবেস ইস্যু করুন।

Update-Database TargetMigration: "<the migration applied before it>"

নির্দিষ্ট হওয়াটির পরে প্রয়োগ করা সমস্ত মাইগ্রেশন সর্বশেষ প্রয়োগের সাথে সাথে প্রথমে প্রয়োগের মাধ্যমে নিম্ন-গ্রেড করা হবে।

পদক্ষেপ 2: প্রকল্প থেকে আপনার স্থানান্তর মুছুন

remove-migration name_of_bad_migration

remove-migrationসত্তা ফ্রেমওয়ার্কের সংস্করণে যদি কমান্ডটি উপলভ্য না থাকে তবে আপনার EF প্রকল্পের 'মাইগ্রেশনস' ফোল্ডারটি ম্যানুয়ালি মুছে ফেলা অনাকাঙ্ক্ষিত স্থানান্তরের ফাইলগুলি মুছুন। এই মুহুর্তে, আপনি একটি নতুন মাইগ্রেশন তৈরি করতে এবং এটি ডাটাবেসে প্রয়োগ করতে মুক্ত are

পদক্ষেপ 3: আপনার নতুন স্থানান্তর যুক্ত করুন

add-migration my_new_migration

পদক্ষেপ 4: ডাটাবেসে আপনার মাইগ্রেশন প্রয়োগ করুন

update-database

6
ইএফ কোর দিয়ে মনে হয় গেট-মাইগ্রেশন সরানো হয়েছে।
কেভিন বার্টন

1
ধাপ ২ ! - খুব দরকারী বৈশিষ্ট্য। যেমন @ কেভিনবার্টন উল্লেখ করেছেন। এবং তারপর add-migration "new migration",update-database
আলেকজান্ডার Frolov

2
আপডেট-ডাটাবেস অভিবাসন: "<মাইগ্রেশন এর আগে প্রয়োগ হয়েছিল>" @ ডেভিড সোপকো
ফুয়াত

ধন্যবাদ @ আলেকজান্ডারফ্রলভ আপনার মন্তব্যগুলি প্রতিবিম্বিত করার জন্য সমাধানটি আপডেট করেছি।
ডেভিড সোপকো

1
আমাদের দ্বিতীয় পদক্ষেপের পরে অপসারণ-স্থানান্তর ব্যবহার করতে হবে
রাহুল

55

যারা এএসপি.নেট কোর ভি ১.০.০ এর সাথে ইএফ কোর ব্যবহার করছেন তাদের জন্য আমারও একই সমস্যা ছিল এবং এটি সংশোধন করতে নিম্নলিখিত কমান্ডগুলি ব্যবহার করেছিলেন (@ ডেভিডসপকো পোস্টটি আমাকে সঠিক দিকে নির্দেশ করেছেন, তবে বিশদটি EF কোরের জন্য কিছুটা আলাদা) :

Update-Database <Name of last good migration>
Remove-Migration

উদাহরণস্বরূপ, আমার বর্তমান বিকাশে কমান্ডটি পরিণত হয়েছিল

PM> Update-Database CreateInitialDatabase
Done.
PM> Remove-Migration
Done.
PM> 

অপসারণ-স্থানান্তর আপনার প্রয়োগ করা সর্বশেষ স্থানান্তর সরিয়ে ফেলবে। যদি আপনার একাধিক মাইগ্রেশন অপসারণের সাথে আরও জটিল পরিস্থিতি থেকে থাকে (আমার কাছে কেবল ২, প্রথমটি এবং খারাপটি ছিল) তবে আমি আপনাকে একটি ডামি প্রকল্পের পদক্ষেপগুলি পরীক্ষা করার পরামর্শ দিই।

EF কোর (v1.0.0) এ বর্তমানে গেট-মাইগ্রেশন কমান্ড হিসাবে উপস্থিত হবে না তাই আপনার মাইগ্রেশন ফোল্ডারে সন্ধান করতে হবে এবং আপনি যা করেছেন তার সাথে পরিচিত হতে হবে। তবে, একটি দুর্দান্ত সহায়তা আদেশ রয়েছে:

PM> get-help entityframework

ভিএস ২০১৫ এসকিউএল সার্ভার অবজেক্ট এক্সপ্লোরারে ডেটাবেস রিফ্রেশ করে আমার সমস্ত ডেটা সংরক্ষণ করা হয়েছিল এবং যে স্থানান্তর আমি ফিরে পেতে চেয়েছিলাম তা চলে গিয়েছিল :)

প্রথমদিকে আমি নিজে থেকে মুছে ফেলা-স্থানান্তর চেষ্টা করেছিলাম এবং ত্রুটি আদেশটি বিভ্রান্তিকর খুঁজে পেয়েছি:

System.InuthorOperationException: স্থানান্তর '...' ইতিমধ্যে ডাটাবেসে প্রয়োগ করা হয়েছে। এটি প্রয়োগ করুন এবং আবার চেষ্টা করুন। যদি অন্য ডাটাবেসে মাইগ্রেশন প্রয়োগ করা হয় তবে নতুন স্থানান্তর ব্যবহার করে এর পরিবর্তনগুলি ফিরিয়ে নেওয়ার বিষয়টি বিবেচনা করুন।

এই শব্দটির উন্নতি করার জন্য ইতিমধ্যে প্রস্তাবনা রয়েছে, তবে আমি এই জাতীয় কিছু বলতে ত্রুটিটি চাই:

ডাটাবেস স্কিমাটিকে সেই অবস্থায় ফিরিয়ে আনতে আপডেট-ডাটাবেস (সর্বশেষ ভাল মাইগ্রেশন নাম) চালান। আপডেট-ডাটাবেসগুলিতে নির্দিষ্ট স্থানান্তরিত হওয়ার পরে এই কমান্ডটি সমস্ত মাইগ্রেশন প্রয়োগ করবে app এরপরে আপনি সরান-অভিবাসন চালাতে পারেন (অপসারণের জন্য মাইগ্রেশন নাম)

EF কোর সহায়তা আদেশ থেকে আউটপুট নিম্নলিখিত:

 PM> get-help entityframework
                     _/\__
               ---==/    \\
         ___  ___   |.    \|\
        | __|| __|  |  )   \\\
        | _| | _|   \_/ |  //|\\
        |___||_|       /   \\\/\\

TOPIC
    about_EntityFrameworkCore

SHORT DESCRIPTION
    Provides information about Entity Framework Core commands.

LONG DESCRIPTION
    This topic describes the Entity Framework Core commands. See https://docs.efproject.net for information on Entity Framework Core.

    The following Entity Framework cmdlets are included.

        Cmdlet                      Description
        --------------------------  ---------------------------------------------------
        Add-Migration               Adds a new migration.

        Remove-Migration            Removes the last migration.

        Scaffold-DbContext          Scaffolds a DbContext and entity type classes for a specified database.

        Script-Migration            Generates a SQL script from migrations.

        Update-Database             Updates the database to a specified migration.

        Use-DbContext               Sets the default DbContext to use.

SEE ALSO
    Add-Migration
    Remove-Migration
    Scaffold-DbContext
    Script-Migration
    Update-Database
    Use-DbContext

6

আপনি ব্যবহার করতে পারেন

Remove-Migration -Force

এটি সর্বশেষ প্রয়োগিত স্থানান্তরকে ফিরিয়ে আনবে এবং সরিয়ে দেবে


4

প্রথমে, এই আদেশের মাধ্যমে আপনার শেষ নিখুঁত স্থানান্তর আপডেট করুন:

Update-Database TargetMigration

উদাহরণ:

Update-Database -20180906131107_xxxx_xxxx

এবং তারপরে আপনার অব্যবহৃত স্থানান্তর ম্যানুয়ালি মুছুন।


2
এটা হওয়া উচিত: আপডেট-ডাটাবেজ -TargetMigration 20180906131107_xxxx_xxxx
Elger Mensonides

Update-Database 20180906131107_xxxx_xxxx(হাইফেন নেই) আমার পক্ষে কাজ করেছিল। TargetMigrationএকটি স্যুইচ হিসাবে কাজ করা কোন সংস্করণ । এই কমান্ডগুলি একটি চলমান লক্ষ্য বলে মনে হচ্ছে (যেমন প্রতি সংস্করণে সেগুলি পরিবর্তন করে)?
যোগফল

3

নেট কোর ২.২ হিসাবে, TargetMigrationমনে হয় চলে গেছে:

get-help Update-Database

NAME
    Update-Database

SYNOPSIS
    Updates the database to a specified migration.


SYNTAX
    Update-Database [[-Migration] <String>] [-Context <String>] [-Project <String>] [-StartupProject <String>] [<CommonParameters>]


DESCRIPTION
    Updates the database to a specified migration.


RELATED LINKS
    Script-Migration
    about_EntityFrameworkCore 

REMARKS
    To see the examples, type: "get-help Update-Database -examples".
    For more information, type: "get-help Update-Database -detailed".
    For technical information, type: "get-help Update-Database -full".
    For online help, type: "get-help Update-Database -online"

সুতরাং এটি এখন আমার জন্য কাজ করে:

Update-Database -Migration 20180906131107_xxxx_xxxx

পাশাপাশি (কোনও -Migrationস্যুইচ নেই):

Update-Database 20180906131107_xxxx_xxxx

একটি যুক্ত নোটে, আপনি আপনার মডেল স্ন্যাপশটটিকে সিঙ্কের বাইরে না রেখে মাইগ্রেশন ফোল্ডারগুলি পরিষ্কার করে আর মুছতে পারবেন না। সুতরাং আপনি যদি এই কঠিন উপায়ে শিখেন এবং খালি মাইগ্রেশনটি চালিয়ে যান যেখানে আপনি জানেন যে সেখানে পরিবর্তন হওয়া উচিত, আপনি চালাতে পারেন (শেষ স্থানান্তরের জন্য কোনও সুইচ দরকার নেই):

Remove-migration

এটি শেষ বিলোপ ফোল্ডারটি ম্যানুয়ালি মুছে ফেলা সত্ত্বেও, এই জগাখিচুড়িটি পরিষ্কার করবে এবং আপনাকে যেখানে দরকার সেখানে ফিরে যাবে।


0

EF 6 এর জন্য এখানে একটি ওয়ান-লাইনার রয়েছে যদি আপনি বিকাশে প্রচুর পরিমাণে পুনরায় মাতাল হন। কেবল ভার্স আপডেট করুন এবং তারপরে ধুয়ে ফেলতে এবং পুনরায় পুনঃস্থাপন করতে প্যাকেজ ম্যানেজার কনসোলে আপ তীরটি ব্যবহার করুন।

$lastGoodTarget = "OldTargetName"; $newTarget = "NewTargetName"; Update-Database -TargetMigration "$lastGoodTarget" -Verbose; Add-Migration "$newTarget" -Verbose -Force

কেন আপনি জিজ্ঞাসা এই প্রয়োজনীয়? এটি EF6 এর কোন সংস্করণগুলি প্রয়োগ করে তা নিশ্চিত নয় তবে যদি আপনার নতুন মাইগ্রেশন টার্গেটটি ইতিমধ্যে প্রয়োগ করা হয়ে থাকে তবে অ্যাড-মাইগ্রেশন-এ পুনরায় স্ক্যাফোর্ডে '-ফোরস' ব্যবহার করা আসলে পুনরায় স্ক্যাফোর্ডে চলবে না, পরিবর্তে একটি নতুন ফাইল তৈরি করবে (এটি ভাল যদিও যদিও আপনি আপনার 'ডাউন' হারাতে চান না)। উপরের স্নিপেট প্রয়োজনে প্রথমে 'ডাউন' করে তবে-ফরাসী পুনরায় স্ক্যাফোল্ড করার জন্য সঠিকভাবে কাজ করে।

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