मैं पहले माइग्रेशन कोड को कैसे निष्क्रिय कर सकता हूं


85

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


जवाबों:


100

डेटाबेस सेट करें। नैशनलिस्ट को शून्य करने के लिए।

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);
    }

2
संदर्भ के उदाहरण निर्माता पर इनिशलाइज़र सेट करना समझ में नहीं आता है। यदि आप एक नया संदर्भ बनाने का प्रयास करते हैं, तो ईएफ वास्तव में उस कोड को प्राप्त करने से पहले इनिशियलाइज़र को बुलाएगा।
जेसीएल

1
वीएस 2017 में "डायग्नोस्टिक टूल" को देखकर बस उत्तर को सत्यापित करें। निर्माण में अशक्त करने के लिए इंसुलेटर सेट करने के बाद पहले वांछित SQL क्वेरी बंद होने से पहले ADO.NET कॉल करता है।
कार्ल

2
यह उम्मीद के मुताबिक काम करता है। यह सही है कि ईएफ पहले इनिशियलाइज़र को बुलाएगा, लेकिन फिर उसे फिर से कंस्ट्रक्टर के अंदर कॉल करना डीबोनक्स्ट को सिर्फ माइग्रेशन को अनदेखा करता है, यदि आप इस तथ्य को अनदेखा करना चाहते हैं कि आपके __MigrationHistoryपास नवीनतम माइग्रेशन नहीं है, और आप नहीं करना चाहते हैं इसे कैसे भी करें। मेरे मामले में, मैं देव वातावरण में माइग्रेशन का उपयोग करता हूं, लेकिन जब मैं उत्पादन के लिए तैनात करता हूं, तो मैं डेटाबेस को अपडेट करने के लिए एसएसडीटी का उपयोग करता हूं। इसलिए, ईएफ शिकायत करेगा कि मॉडल बदल गया है क्योंकि __MigrationHistoryनवीनतम प्रवासन नहीं होगा, लेकिन मैं डेटाबेस को अद्यतन करने की गारंटी दे सकता हूं।
एलिसन

मैं सुझाव दूंगा Database.SetInitializerकि कंस्ट्रक्टर से क्लास कंस्ट्रक्टर के पास कॉल करें । यह सुनिश्चित करता है कि कॉल केवल एक बार ही किया जाए।
स्टीवन

40

तो सबसे पूरा जवाब जो मुझे मिला है वह यह है:

  1. Migrationsअपने प्रोजेक्ट के अंदर फ़ोल्डर हटाएं ।
  2. Database.SetInitializer<DatabaseContext>(null);अपने DatabaseContext initializer के अंदर सेट करें ।
  3. __MigrationHistoryअपने डेटाबेस के अंदर तालिका हटाएं । EF6 + के लिए तालिका के अंतर्गत स्थित है, Tablesलेकिन पहले के संस्करणों के लिए यह नीचे स्थित है System Tables
  4. बनाएँ और चलाएँ।
  5. फायदा।

दुर्भाग्य से इन चरणों का पालन करने के बाद, EF6 अभी भी __MigrationHistoryहर बार मेरे आवेदन शुरू होने के समय की जाँच करता है जो कि मेरे ऐप के स्टार्टअप समय में कुछ और मिलीसेकंड जोड़ता है। क्या __MigrationHistoryचेक को पूरी तरह से निष्क्रिय करने का कोई तरीका है ?
दाई

27

यदि आप पूरी तरह से पलायन बंद करना चाहते हैं:

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

हालाँकि, मैंने पहले माइग्रेशन सक्षम कोड रखना बेहतर समझा, लेकिन -Scriptईएफ के विकल्प का उपयोग करके मेरे लिए एक डीबी परिवर्तन स्क्रिप्ट बनाएं जिसे मैं प्रत्येक डेटाबेस (विकास, क्यूए, उत्पादन) पर मैन्युअल रूप से लागू कर सकता हूं:

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

इस तरह से EF मेरे लिए परिवर्तन स्क्रिप्ट बनाएगा, और लागू होने वाले परिवर्तनों पर मेरा अभी भी पूर्ण नियंत्रण है। मैं किसी अन्य स्रोत कोड की तरह परिवर्तन स्क्रिप्ट का संस्करण देता हूं।


1
आपका लिंक वास्तव में संगत नहीं है completely turn off migrations। ऐसा करने के लिए: Database.SetInitializer<YourContextType>(null)अपने आवेदन के स्टार्टअप में जोड़ें
डॉन चीडल

किसी भी विचार कैसे ईएफ कोर के साथ इसे प्राप्त करने के लिए?
शिमी वेइटहैंडलर

@ शमी: ईएफ कोर को कभी भी अपने डेटाबेस को बदलने की कोशिश नहीं करनी चाहिए। देखें github.com/dotnet/efcore/issues/3152
एरिक जे

26

यदि आप पहले से ही माइग्रेशन का उपयोग करते हैं तो केवल शुरुआती बदलने से मदद नहीं मिलेगी। आपको प्रबंधन स्टूडियो में जाने की जरूरत है, अपने डेटाबेस तालिकाओं को खोलें, System Tablesफ़ोल्डर पर जाएं और __MigrationHistoryवहां स्थित तालिका को हटा दें (ईएफ 6 और इसके बाद के संस्करण के लिए, यह सीधे नीचे स्थित है Tables)। यह अच्छे के लिए माइग्रेशन अक्षम कर देगा।


7
तालिका __ माइग्रेशनहिस्टर सीधे टेबल्स के तहत स्थित है, न कि सिस्टम टेबल्स के तहत।
पीटर हेडबर्ग 10

6
@PeterHedberg यह EF6 + के लिए सही है। पहले के संस्करणों के लिए यह नीचे था System Tables
एपिसोडएक्स

1
आप इसका उपयोग करते हुए, इसे हटाने के बजाय, तालिका का नाम बदल सकते हैं sp_rename। मैंने इनिशियलाइज़र को भी निष्क्रिय कर दिया।
NMrt

2

मैंने अभी इस "मुद्दे" को हल किया है

  1. डेटाबेस से तालिका "_MigrationHistory" हटा रहा है।
  2. "माइग्रेशन" फ़ोल्डर को हटाने से प्रोजेक्ट बनता है।
  3. EDMX फ़ाइल अपडेट कर रहा है।
  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 फ़ाइल में क्या अपडेट किया है? मैं पहले डेटाबेस का उपयोग भी कर रहा हूँ और यह अभी भी गैर-मौजूद माइग्रेशन टेबल्स को क्वेरी कर रहा है ... धन्यवाद!
dalcam

क्या होगा अगर बाद में हमें पलायन की आवश्यकता होती है, तो क्या यह _MigrationHistoryस्वचालित रूप से नई तालिका बनाता है ?
19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.