আমি কোডটি প্রথম স্থানান্তরকে কীভাবে অক্ষম করতে পারি


86

EF5 এ আমার একটি কোড-ফার্স্ট সত্তা মডেল রয়েছে। তবে আমি নিজেই ডাটাবেস পরিবর্তনগুলি পরিচালনা করতে চাই - আমি চাই না EF আমার বিদ্যমান ডাটাবেস এবং এর সমস্ত ডেটা পরিবর্তন করতে। তবে আমি যখন ইএফ ম্যাপিং এবং ডাটাবেসে সমান্তরাল পরিবর্তন করি, তখন ইএফ সঠিকভাবে পরিচালনা করতে অস্বীকার করে আমাকে কোডটি প্রথম স্থানান্তরিত করতে হবে। আমি কীভাবে এটি বন্ধ করব?


উত্তর:


102

ডাটাবেস.সেটআইনিটিয়ালাইজারকে নালায় সেট করুন।

public class DatabaseContext: DbContext
{
    //the base accepts the name of the connection string provided in the web.config as a parameter
    public DatabaseContext()
        : base("DatabaseContext")
    {
        //disable initializer
        Database.SetInitializer<DatabaseContext>(null);
    }

4
প্রসঙ্গের দৃষ্টান্তের কনস্ট্রাক্টরটিতে আরম্ভকারীটি সেট করা অর্থহীন নয়। আপনি যদি কোনও নতুন প্রসঙ্গ তৈরি করার চেষ্টা করেন তবে EF প্রাথমিকভাবে সেই কোডটিতে পৌঁছানোর আগে আরম্ভকারীকে কল করবে call
জেএলসি

4
কেবলমাত্র ভিএস 2017 এ "ডায়াগনস্টিক সরঞ্জাম" দেখে উত্তরটি যাচাই করা হয়েছে the কনস্ট্রাক্টরের অন্তর্নিদীকরণ স্থির করে প্রথমে চেয়েছিল এসকিউএল কোয়েরির আগে ADO.NET কলগুলি বন্ধ হয়ে গেছে।
কার্ল

4
এটি প্রত্যাশার মতো কাজ করে। এটি সত্য যে ইএফ এর আগে ইনিশিয়ালাইজারকে কল করবে, কিন্তু তারপরে কনস্ট্রাক্টরের ভিতরে আবার ফোন করা DbContextকে কেবল স্থানান্তরকে অগ্রাহ্য করবে, যদি আপনি এই সত্যটি উপেক্ষা করতে চান যে আপনার __MigrationHistoryসর্বশেষতম স্থানান্তর নেই, এবং আপনি চান না যেভাবে হোক এটি কর. আমার ক্ষেত্রে, আমি দেব পরিবেশে মাইগ্রেশন ব্যবহার করি তবে আমি যখন প্রোডাকশনে নিযুক্ত করি তখন ডেটাবেস আপডেট করার জন্য আমি এসএসডিটি ব্যবহার করি। অতএব, ইএফ অভিযোগ করবে যে মডেলটি পরিবর্তিত হয়েছে কারণ __MigrationHistoryসর্বশেষতম মাইগ্রেশন হবে না, তবে আমি গ্যারান্টি দিতে পারি যে ডাটাবেস আপডেট হয়েছে।
অ্যালিসন

আমি কলটি Database.SetInitializerকনস্ট্রাক্টর থেকে ক্লাস কনস্ট্রাক্টরে স্থানান্তরিত করার পরামর্শ দেব । এটি কলটি কেবলমাত্র একবার করা হয়েছে তা নিশ্চিত করে।
স্টিভেন

41

সুতরাং আমি যে সর্বাধিক সম্পূর্ণ উত্তর পেয়েছি তা হ'ল:

  1. Migrationsআপনার প্রকল্পের ভিতরে ফোল্ডার মুছুন ।
  2. Database.SetInitializer<DatabaseContext>(null);আপনার ডাটাবেস কনটেক্সট ইনিশিয়ালাইজারের ভিতরে সেট করুন ।
  3. __MigrationHistoryআপনার ডাটাবেসের ভিতরে সারণী মুছুন । EF6 + এর জন্য টেবিলটি এর নীচে অবস্থিত Tablesতবে পূর্ববর্তী সংস্করণগুলির জন্য এটি নীচে অবস্থিত System Tables
  4. বিল্ড এবং রান করুন।
  5. লাভ।

দুর্ভাগ্যক্রমে এই পদক্ষেপগুলি অনুসরণ করার পরে, EF6 এখনও __MigrationHistoryপ্রতিবারই আমার অ্যাপ্লিকেশন শুরু হওয়ার অস্তিত্বের জন্য যাচাই করে যা আমার অ্যাপ্লিকেশনটির শুরু হওয়ার সময় আরও কয়েক মিলিয়ন সেকেন্ড যুক্ত করে। __MigrationHistoryচেকটি পুরোপুরি নিষ্ক্রিয় করার কোনও উপায় আছে কি ?
দাই

27

আপনি যদি পুরোপুরি মাইগ্রেশন বন্ধ করতে চান:

https://stackoverflow.com/a/9709407/141172

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

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

এইভাবে EF আমার জন্য পরিবর্তন স্ক্রিপ্ট তৈরি করবে এবং পরিবর্তনগুলি প্রয়োগ করার বিষয়ে আমার এখনও সম্পূর্ণ নিয়ন্ত্রণ রয়েছে। আমি অন্য কোনও উত্স কোডের মতো পরিবর্তন স্ক্রিপ্টগুলিকে সংস্করণ করি।


4
আপনার লিঙ্কটি সত্যই দায়বদ্ধ নয় completely turn off migrations। এটি করার জন্য: Database.SetInitializer<YourContextType>(null)আপনার অ্যাপ্লিকেশনটির প্রারম্ভকালে যুক্ত করুন
ডন চ্যাডল

ইএফ কোর দিয়ে কীভাবে এটি অর্জন করবেন কোনও ধারণা?
শিমি ওয়েটজ্যান্ডলার

@ শিম্মি: ইএফ কোর কখনই স্বয়ংক্রিয়ভাবে আপনার ডাটাবেস পরিবর্তন করার চেষ্টা করা উচিত নয়। দেখুন github.com/dotnet/efcore/issues/3152
এরিক জে

26

আপনি যদি ইতিমধ্যে মাইগ্রেশন ব্যবহার করেন তবে কেবল ইনিশিয়ালাইজার পরিবর্তন করলে কোনও লাভ হবে না। আপনাকে ম্যানেজমেন্ট স্টুডিওতে যেতে হবে, আপনার ডাটাবেস টেবিলগুলি খুলতে হবে, System Tablesফোল্ডারে যেতে হবে এবং __MigrationHistoryসেখানে অবস্থিত টেবিলটি সরিয়ে ফেলতে হবে (EF6 এবং উপরে, এটি সরাসরি নীচে অবস্থিত Tables)। এটি মাইগ্রেশনগুলিকে ভাল করার জন্য অক্ষম করবে।


7
সারণি __MigrationHistory সিস্টেম টেবিলগুলির পরিবর্তে সরাসরি টেবিলের অধীনে অবস্থিত।
পিটার হেডবার্গ

6
@ পিটারহেডবার্গ এটি ইএফ 6 + এর জন্য সত্য। পূর্ববর্তী সংস্করণগুলির জন্য এটি অধীন ছিল System Tables
এপিসোডেক্স

4
আপনি টেবিলটি মুছে ফেলার পরিবর্তে, নামটি পরিবর্তন করেও ব্যবহার করতে পারেন sp_rename। আমি আরম্ভকারীটিকে অক্ষমও করে দিয়েছি।
এনএমআরটি

2

আমি এই "সমস্যা" এর দ্বারা সমাধান করেছি

  1. ডাটাবেস থেকে সারণি "_MigrationHistory" মুছে ফেলা হচ্ছে।
  2. "মাইগ্রেশন" ফোল্ডারটি মোছা প্রকল্পটি তৈরি করে।
  3. ইডিএমএক্স ফাইল আপডেট করা হচ্ছে।
  4. প্রকল্পটি পরিষ্কার করুন এবং এটি পুনর্নির্মাণ করুন।

আমার পরিবেশের কনফিগারেশনটি অনুসরণ করছে

1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0

আপনি কি EDMX ফাইল আপডেট করেছেন তা জিজ্ঞাসা করতে পারি? আমি প্রথম ডেটাবেসও ব্যবহার করছি এবং এটি এখনও অস্তিত্বহীন মাইগ্রেশন টেবিলগুলি অনুসন্ধান করছে ... ধন্যবাদ!
ডালক্যাম

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