vb.net - 4.5.net framework



कोड-फर्स्ट का उपयोग करते समय अपडेट-डाटाबेस में त्रुटि: "डेटाबेस में पहले से ही एक ऑब्जेक्ट 'कुछ' है।" (1)

मैं विजुअल स्टूडियो 2015 में कोड-फर्स्ट का उपयोग कर डेटाबेस माइग्रेशन कर रहा हूं। रास्ते के साथ, मैंने प्रवासन कदम अप-माइग्रेशन तक किया है।

ऐड-माइग्रेशन के बाद, मैंने कोड की यह रेखा जोड़ दी है

Database.SetInitializer(New MigrateDatabaseToLatestVersion(Of DbContext1, Migrations.Configuration))

मेरे डीबीसीटेक्स्ट कन्स्ट्रक्टर में डेटाबेस इनिशियलाइज़र सेट अप करने के बाद से जब मैंने इस चरण को पहले याद किया। उसके बाद, मैंने निष्पादित किया

"Add-Migration initial -Force"

पैकेज प्रबंधक कंसोल में क्योंकि मुझे डर है कि इस भाग को ऐड-माइग्रेशन प्रक्रिया में आवश्यक है I तब, मैं सीधे निष्पादित

"Update-Database"

समस्या यह है के बाद मैं यह किया है, एक त्रुटि बाहर आता है

इस ऑपरेशन को 'मास्टर' डेटाबेस से एक कनेक्शन की आवश्यकता है 'मास्टर' डेटाबेस से कनेक्शन बनाने में असमर्थ क्योंकि मूल डेटाबेस कनेक्शन खोल दिया गया है और क्रेडेंशियल को कनेक्शन स्ट्रिंग से हटा दिया गया है। एक बंद खुला कनेक्शन प्रदान करें।

जोड़ा

मेरे कंप्यूटर को पुनरारंभ करने के बाद, उपरोक्त त्रुटि अब नहीं निकली जब मैंने 'अपडेट-डाटाबेस' निष्पादित किया। इसके बजाय, एक और त्रुटि सामने आई:

डाटाबेस में 'कुछ' नाम के एक वस्तु पहले से मौजूद है

मैंने निष्पादित करने के लिए एक उत्तर धागा देखा

Add-Migration Initial -IgnoreChanges

के बाद

Update-Database -verbose

मैंने दोनों की कोशिश की है लेकिन यह अभी भी एक ही त्रुटि दिखाता है


अपनी समस्याओं को ठीक करने में सक्षम होने के लिए आपको समझना चाहिए कि ईएफ कनेक्शन स्ट्रिंग के साथ कैसे काम करता है और माइग्रेशन कैसे काम करता है।

EF कनेक्शन स्ट्रिंग के साथ कैसे सौदे करता है : आमतौर पर आपके DbContext में एक DbContext कन्स्ट्रक्टर होता है, जो हार्ड कोड वाले कनेक्शन स्ट्रिंग नाम के साथ अपने बेस क्लास कन्स्ट्रक्टर को कॉल करता है। आपकी प्रोजेक्ट app.config या web.config फ़ाइल में एक connectionStrings app.config अनुभाग होना चाहिए जो उस नाम के साथ एक कनेक्शन स्ट्रिंग को परिभाषित करता है। यह आपके प्रोजेक्ट में उपयोग की जाने वाली डिफ़ॉल्ट कनेक्शन स्ट्रिंग है, जब आप स्पष्ट रूप से पैकेज प्रबंधक कंसोल कमांड में कनेक्शन स्ट्रिंग पैरामीटर नहीं देते हैं

कनेक्शन स्ट्रिंग नाम के साथ कुछ उदाहरण कोड MyConnectionStringName :

public class MyDbContext : DbContext
{
    public MyDbContext() : base("MyConnectionStringName") { ... }
    ...
}

और आपकी .config फ़ाइल में:

<configuration>
  ...
  <connectionStrings>
    <add name="MyConnectionStringName" connectionString="..." />
  </connectionStrings>
</configuration>

यदि आप उस दृष्टिकोण का उपयोग नहीं करते हैं तो आप अभी भी मैन्युअल रूप से सही कनेक्शन स्ट्रिंग पैरामीटर के रूप में पैकेज प्रबंधक कंसोल में Update-Database रूप में प्रदान कर सकते हैं:

Update-Database -ConnectionString <your connection string here> -ConnectionProviderName System.Data.SqlClient

आप अपने .config फ़ाइल में परिभाषित किसी भी कनेक्शन स्ट्रिंग नाम का भी उपयोग कर सकते हैं:

Update-Database -ConnectionStringName MyConnectionStringName

और अब माइग्रेशन कैसे कार्य करता है : माइग्रेशन कोड फाइल हैं I हर बार जब आप Add-Migration चलाते हैं तो एक कोड फ़ाइल जनरेट / अपडेट होती है, आमतौर पर एक फ़ोल्डर में जिसे आपके प्रोजेक्ट में Migrations कहा जाता है। माइग्रेशन फ़ाइल का नाम Add-Migration चलाने के दौरान उपयोग किए जाने वाले नाम से जुड़ी अपनी पीढ़ी के टाइमस्टैम्प से बना है। आप उन फ़ाइलों की सामग्री को देख सकते हैं और Add-Migration चलाने के प्रभाव को देख सकते हैं। आप उन्हें एक बार जनरेट कर सकते हैं, और अपना स्वयं का कोड जोड़ सकते हैं, हालांकि इस समय तक आपको ऐसा करने की आवश्यकता नहीं होनी चाहिए।

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

हर एकल प्रवास में एक विधि Up और एक विधि Down । जब आप Update-Database चलाते हैं तो हमेशा दो अप्रत्यक्ष पैरामीटर हैं: SourceMigration और TargetMigration । ईएफ वृद्धिशील रूप से SourceMigration और TargetMigration (या Down विधियों के बीच सभी माइग्रेशन के Up विधियों पर लागू होता है यदि आप अपने डेटाबेस डाउनग्रेड कर रहे हैं)। जब आप SourceMigration और TargetMigration पैरामीटर निर्दिष्ट नहीं करते हैं, तो डिफ़ॉल्ट परिदृश्य यह है कि SourceMigration डेटाबेस पर लागू अंतिम माइग्रेशन है और TargetMigration लंबित लोगों की अंतिम संख्या है। ईएफ उन पैरामीटरों को अपनी प्रोजेक्ट के डिफॉल्ट डाटाबेस के __MigrationsHistory तालिका से पूछताछ के द्वारा निर्धारित करता है, इसलिए यदि वह डेटाबेस एक सुसंगत स्थिति में नहीं है तो आपके माइग्रेशन को गलत तरीके से उत्पन्न किया जा सकता है। मुझे लगता है कि यही आपकी समस्याएं पैदा कर रहा है।

इसलिए हर बार जब आप Update-Database एएफ चलाते हैं तो __MigrationsHistory तालिका में पता चलता है कि आपके डेटाबेस की स्थिति के आधार पर कौन सा माइग्रेशन चलाना चाहिए, और माइग्रेशन के एसक्यूएल को निष्पादित करने के बाद प्रत्येक लागू माइग्रेशन के लिए उस तालिका में एक नया रिकॉर्ड डाला जाता है ।

ऐसा लगता है कि कुछ बिंदु पर आपके डेटाबेस __MigrationsHistory सामग्री __MigrationsHistory हुई थी। ऐसा तब होता है जब Update-Database और Add-Migrations चलाने के बिना सही क्रम का इस्तेमाल किया जाता है और -force पैरामीटर का उपयोग कर।

अपनी समस्याओं को ठीक करने के लिए मेरी सलाह : खरोंच से शुरू करें: अपना डेटाबेस हटाएं, अपनी माइग्रेशन फाइलों को हटा दें, Add-Migration Initial साथ एक नया साफ Initial Add-Migration Initial , Update-Database साथ केवल एक बार इसे चलाएं। उस बिंदु से, हर बार जब आप अपना मॉडल कोड बदलते हैं, तो आप हर बार अलग-अलग नामों का उपयोग करके, Add Migration YourNewMigrationName को Add Migration YourNewMigrationName साथ एक नया वृद्धिशील माइग्रेशन उत्पन्न करते हैं, और Update-Database एक बार Add Migration YourNewMigrationName नए माइग्रेशन लागू करते हैं।

नोट: वृद्धिशील माइग्रेशन के बजाय, अगर आपके पास माइग्रेशन के बारे में पर्याप्त ज्ञान है तो आप केवल एक Initial माइग्रेशन का उपयोग कर सकते हैं और जब भी आपका मॉडल कोड बदलता है, तो Add-Migrations Initial -force को निष्पादित करके -force पैरामीटर सुनिश्चित करता है कि एक नया माइग्रेशन फ़ाइल बनाने के बजाय आपकी मौजूदा Initial माइग्रेशन फ़ाइल ओवरराइट की जाएगी। यह दृष्टिकोण विकास चरण पर आसान आता है, लेकिन उत्पादन में आमतौर पर यह एक अच्छा दृष्टिकोण नहीं है, जैसा कि आप संभवत: अपने डेटाबेस अपडेट को लगातार बढ़ाना चाहते हैं, हर बार जब आप अपने कोड के नए संस्करण को लागू करेंगे (आप संभवत: अपना डेटाबेस छोड़ नहीं पाएंगे और इसे फिर से बनाएं, और आपको अपने डेटा को बनाए रखने और यह सुनिश्चित करने की ज़रूरत होगी कि आपके डेटाबेस को अद्यतन करते समय आपके पास डेटा हानि नहीं है)।

माइग्रेशन कोड फाइल हैं जो आपके डेटाबेस को बनाने और अपडेट करने के लिए ईएफ द्वारा जनरेट किए जाते हैं। जब आप Update-Database चलाते हैं तो माइग्रेशन SQL में अनुवादित होते हैं जो आपके डेटाबेस के विरुद्ध निष्पादित होता है। यदि आप देखना चाहते हैं कि विशिष्ट माइग्रेशन के लिए सटीक एसक्यूएल जेनरेट किया जा रहा है तो आप Update-Database -Script -SourceMigration SomeMigration -TargetMigration SomeOtherMigration माइग्रेशन कुछ माइग्रेशन Update-Database -Script -SourceMigration SomeMigration -TargetMigration SomeOtherMigration माइग्रेशन, कुछ अन्य माइग्रेशन चला सकते हैं। यह कमांड डेटाबेस को संशोधित नहीं करता है, बस एसक्यूएल को उत्पन्न करता है और दिखाता है जो वास्तविक Update-Database निष्पादन में लागू किया जाएगा।

माइग्रेशन बनाने और चलाने के बारे में अधिक जानकारी यहां पाई जा सकती है

सौभाग्य!





ef-code-first