मैं अलग-अलग डेटाबेस के लिए कई संदर्भों के लिए EF माइग्रेशन कैसे सक्षम करूं?


122

मैं एक ही परियोजना में कई DB संदर्भों के लिए एंटिटी फ्रेमवर्क 5 (संस्करण 5.0.0) माइग्रेशन को कैसे सक्षम कर सकता हूं, जहां प्रत्येक संदर्भ अपने स्वयं के डेटाबेस से मेल खाता है? जब मैं Enable-Migrationsपीएम कंसोल (विजुअल स्टूडियो 2012) में दौड़ता हूं , तो कई संदर्भ होने के कारण त्रुटि होती है:

PM> Enable-Migrations
More than one context type was found in the assembly 'DatabaseService'.
To enable migrations for DatabaseService.Models.Product1DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext.
To enable migrations for DatabaseService.Models.Product2DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext.

यदि मैं भागता Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContextहूं तो मुझे चलाने की अनुमति नहीं है Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContextक्योंकि प्रवास पहले से मौजूद है:Migrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter.


जवाबों:


126

Enable-Migrations की दूसरी कॉल इसलिए विफल हो रही है क्योंकि कॉन्फ़िगरेशन.cs फ़ाइल पहले से मौजूद है। यदि आप उस वर्ग और फ़ाइल का नाम बदलते हैं, तो आपको उस 2 सक्षम-माइग्रेशन को चलाने में सक्षम होना चाहिए, जो अन्य कॉन्फ़िगरेशन बना देगा।

फिर आपको यह निर्दिष्ट करना होगा कि डेटाबेस को अपडेट करते समय आप किस कॉन्फ़िगरेशन का उपयोग करना चाहते हैं।

Update-Database -ConfigurationTypeName MyRenamedConfiguration

1
"MyRenamedConfiguration" क्या है?
रॉबर्ट नोअक

1
"MyRenamedConfiguration" एक उदाहरण के रूप में केवल धारक पाठ है। आप अपने मूल कॉन्फ़िगरेशन का नाम बदलकर कुछ भी कर सकते हैं (जैसे FooBar, फिर Update-Database -ConfigurationTypeName FooBar चलाएं)।
अंक

3
छोटा रूप: अपडेट-डेटाबेस -conf MyRenamedConfiguration
पीटर केर

100

@Ckal ने जो सुझाव दिया, उसके अलावा, प्रत्येक नामांकित विन्यास को देना महत्वपूर्ण है। अपने स्वयं के नामस्थान। यदि आप नहीं करते हैं, तो ईएफ गलत संदर्भ के लिए माइग्रेशन लागू करने का प्रयास करेगा।

यहाँ विशिष्ट कदम हैं जो मेरे लिए अच्छा काम करते हैं।

यदि माइग्रेशन गड़बड़ कर रहे हैं और आप एक नई "बेसलाइन" बनाना चाहते हैं:

  1. माइग्रेशन फ़ोल्डर में कोई भी मौजूदा .cs फ़ाइलें हटाएं
  2. SSMS में, __MigrationHistory सिस्टम तालिका हटाएं।

प्रारंभिक माइग्रेशन बनाना:

  1. पैकेज मैनेजर कंसोल में:

    Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
    NamespaceOfContext.ContextA -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextA
  2. समाधान एक्सप्लोरर में: माइग्रेशन का नाम बदलें। Configuration.cs to Migrations.ConfigurationA.cs। विजुअल स्टूडियो का उपयोग करने पर यह स्वचालित रूप से निर्माता का नाम बदलना चाहिए। सुनिश्चित करें कि यह करता है। EditA.cs को संपादित करें: नाम स्थान को NamespaceOfContext.Migrations.MigrationsA में बदलें

  3. Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
    NamespaceOfContext.ContextB -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextB
  4. समाधान एक्सप्लोरर में: माइग्रेशन का नाम बदलें। Configuration.cs से Migrations.ConfigurationB.cs। फिर से, सुनिश्चित करें कि निर्माणकर्ता को भी उचित नाम दिया गया है। एडिट विन्यासबी.केएस: नाम स्थान को नामस्थान में बदलें।

  5. add-migration InitialBSchema -IgnoreChanges -ConfigurationTypeName
    ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextB 
  6. Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
  7. add-migration InitialSurveySchema -IgnoreChanges -ConfigurationTypeName
    ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName
    NameOfMainProject  -ConnectionStringName ContextA 
  8. Update-Database -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA

पैकेज मैनेजर कंसोल में माइग्रेशन स्क्रिप्ट बनाने के चरण:

  1. चलाने के आदेश

    Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA

    या -

    Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB

    जब तक परिवर्तनों को DB पर लागू नहीं किया जाता है तब तक इस आदेश को फिर से चलाना ठीक है।

  2. या तो वांछित स्थानीय डेटाबेस के खिलाफ स्क्रिप्ट चलाएं, या स्थानीय रूप से लागू करने के लिए अपडेट-डेटाबेस बिना -स्क्रिप्ट चलाएं:

    Update-Database -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA

    या -

    Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB

# 4 परिवर्तन: कॉन्फ़िगरेशन को संपादित करें। एसीएस -> कॉन्फ़िगरेशनबीबीएस को संपादित करें।
ब्रायन रिज़ो

1
@ बिरन: ध्यान देने के लिए धन्यवाद। मैंने उत्तर संपादित किया। ध्यान दें, आप स्वयं भी उत्तर संपादित कर सकते हैं। चूँकि आपके पास अभी तक 2000 की प्रतिष्ठा नहीं है, आपके उत्तर एक समीक्षा कतार में हैं, लेकिन यह कतार आमतौर पर तेजी से काम करती है, इसलिए आपके संपादन को कुछ ही मिनटों में अनुमोदित किया जाएगा।
एरिक जे।

5
धन्यवाद! यही तो मैं याद कर रहा था (नाम स्थान)।
विलियम एम। रॉल्स

यह मदद कर सकता है क्योंकि यह मेरे लिए स्पष्ट नहीं था कि चरण 2 में नामकरण कैसे किया जाए , और शुरू में 4 : जब आप कॉन्फ़िगरेशन का नाम बदलकर विन्यास ए.के.एस. या कॉन्फ़िगरेशनबी.के लिए रख देते हैं, तो नाम बदलने का भी वर्ग में परिणाम होना चाहिए और इसके कंस्ट्रक्टर का नाम बदलकर विन्यास या कॉन्फ़िगरेशनबी भी किया जा रहा है। जब आप ऐड-माइग्रेशन कमांड चलाते हैं तो क्लास का नाम बदलने में त्रुटि का कारण होगा - "माइग्रेशन कॉन्फ़िगरेशन प्रकार 'कॉन्फ़िगरेशन' असेंबली में नहीं पाया गया था ..." - " और हाँ, शब्दांकन ठीक उसी तरह बुरा था उस त्रुटि संदेशों में जो मुझे VS2013 में मिला - LOL
ग्रेग बर्थ

3
इससे मुझे मदद मिली! सभी विकल्पों और आदेश के साथ पूर्ण निर्देश। मुझे बचाया घंटे
elcool

81

मैं बस एक ही समस्या से टकराया और मैंने निम्नलिखित समाधान का उपयोग किया (सभी पैकेज मैनेजर कंसोल से)

PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextA" -ContextTypeName MyProject.Models.ContextA
PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextB" -ContextTypeName MyProject.Models.ContextB

यह माइग्रेशन फ़ोल्डर में 2 अलग फ़ोल्डर बनाएगा। प्रत्येक में जनरेट की गई Configuration.csफ़ाइल होगी। दुर्भाग्य से आपको अभी भी उन Configuration.csफ़ाइलों का नाम बदलना होगा अन्यथा उनमें से दो होने की शिकायतें होंगी। मैंने अपनी फ़ाइलों का नाम बदलकर ConfigA.csऔरConfigB.cs

EDIT : (शिष्टाचार केविन मैकफीट) याद रखें कि जब कॉन्फ़िगरेशन का नाम बदला जा रहा है। फ़ाइलें, वर्ग के नाम और कंस्ट्रक्टर / EDIT का भी नाम बदलें

इस संरचना के साथ आप बस कर सकते हैं

PM> Add-Migration -ConfigurationTypeName ConfigA
PM> Add-Migration -ConfigurationTypeName ConfigB

जो कॉन्फ़िगर फ़ाइलों के बगल में फ़ोल्डर के अंदर माइग्रेशन के लिए कोड फ़ाइलों को बनाएगा (यह उन फ़ाइलों को एक साथ रखने के लिए अच्छा है)

PM> Update-Database -ConfigurationTypeName ConfigA
PM> Update-Database -ConfigurationTypeName ConfigB

और अंतिम लेकिन कम से कम उन दो आदेशों से उनके गार्जिंग डेटाबेस पर सही माइग्रेशन लागू नहीं होगा।

EDIT 08 फरवरी, 2016: मैंने EF7 संस्करण 7.0.0-rc1-16348 के साथ थोड़ा परीक्षण किया है

मुझे काम करने के लिए -o | --outputDir विकल्प नहीं मिल सका। यह देता रहाMicrosoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument

हालाँकि ऐसा लगता है कि माइग्रेशन फ़ोल्डर में पहली बार माइग्रेशन जुड़ने के बाद इसे जोड़ा जाता है, और किसी अन्य संदर्भ के लिए बाद में माइग्रेशन स्वचालित रूप से माइग्रेशन के उप-फ़ोल्डर में डाल दिया जाता है।

मूल नाम ContextAकुछ नामकरण सम्मेलनों का उल्लंघन करने के लिए लगता है इसलिए मैं अब उपयोग करता हूं ContextAContextऔर ContextBContext। इन नामों का उपयोग आप निम्न आदेशों का उपयोग कर सकते हैं: (ध्यान दें कि मेरा dnx अभी भी पैकेज मैनेजर कंसोल से काम करता है और मुझे माइग्रेशन करने के लिए एक अलग सीएमडी विंडो खोलना पसंद नहीं है)

PM> dnx ef migrations add Initial -c "ContextAContext"
PM> dnx ef migrations add Initial -c "ContextBContext"

यह एक मॉडल स्नैपशॉट और के लिए Migrationsफ़ोल्डर में एक प्रारंभिक माइग्रेशन बनाएगा ContextAContext। यह ContextBइन फ़ाइलों के लिए नाम से एक फ़ोल्डर बनाएगाContextBContext

मैंने मैन्युअल रूप से एक ContextAफ़ोल्डर जोड़ा और माइग्रेशन फ़ाइलों ContextAContextको उस फ़ोल्डर से स्थानांतरित कर दिया। फिर मैंने उन फ़ाइलों के अंदर नाम स्थान का नाम बदल दिया (स्नैपशॉट फ़ाइल, प्रारंभिक माइग्रेशन और ध्यान दें कि प्रारंभिक माइग्रेशन फ़ाइल ... डिज़ाइनर .cs) के तहत एक तीसरी फ़ाइल है। मुझे .ContextAनामस्थान में जोड़ना था , और वहां से रूपरेखा इसे फिर से स्वचालित रूप से संभालती है।

निम्नलिखित आदेशों का उपयोग करना प्रत्येक संदर्भ के लिए एक नया प्रवासन बनाएगा

PM>  dnx ef migrations add Update1 -c "ContextAContext"
PM>  dnx ef migrations add Update1 -c "ContextBContext"

और उत्पन्न फ़ाइलों को सही फ़ोल्डर में डाला जाता है।


5
सबसे अच्छा समाधान, सरल और हम एक स्पष्ट फ़ोल्डर रखते हैं।
मलिक

2
यह वह उत्तर था जिसकी मुझे आवश्यकता थी। नाम स्थान के माध्यम से जोड़ा -MigrationsDirectory जवाब था! धन्यवाद।
क्रोब

1
अच्छा और साफ समाधान। धन्यवाद।
स्टीफन सेबुलक

4
1,5 साल बाद, मुझे खुशी है कि मैं एक नई परियोजना को स्थापित करने के लिए अपने स्वयं के पोस्ट का उपयोग कर सकता हूं।
bart s

1
ध्यान दें कि जब आप add-migrationइसे चलाते हैं तो यह आपके लिए संकेत देगा Name। जब से मैं पहले से ही प्रदान कर रहा था तब यह मुझे थोड़ा बंद कर दिया ConfigurationTypeNameऔर जब यह कहा तो थोड़ा नाराज हो गया Name:। लेकिन निश्चित रूप से नाम यह चाहता है कि परिवर्तन का 'मानव पठनीय' वर्णन हो - जैसे। AddedProductsया IncreaseLengthOfNameFields। माइग्रेशन फ़ोल्डर में आप इसे क्लास नाम के हिस्से के रूप में प्राप्त करेंगे ताकि यह देखना आसान हो जाए कि क्या है। इसलिए प्रभाव Nameकी तरह एक चेक-इन टिप्पणी की तरह है।
सिमोन_विवर

7

यदि आपके पास पहले से ही कई प्रवासियों के साथ "कॉन्फ़िगरेशन" है और इसे रखना चाहते हैं, तो आप हमेशा एक नया "कॉन्फ़िगरेशन" वर्ग बना सकते हैं, इसे दूसरा नाम दें, जैसे

class MyNewContextConfiguration : DbMigrationsConfiguration<MyNewDbContext>
{
   ...
}

तो बस आदेश जारी करें

Add-Migration -ConfigurationTypeName MyNewContextConfiguration InitialMigrationName

और EF समस्याओं के बिना माइग्रेशन को मचान बना देगा। अंत में अपने डेटाबेस को अपडेट करें, अब से, ईएफ शिकायत करेगा यदि आप उसे नहीं बताते हैं कि आप किस कॉन्फ़िगरेशन को अपडेट करना चाहते हैं:

Update-Database -ConfigurationTypeName MyNewContextConfiguration 

किया हुआ।

आपको सक्षम-माइग्रेशन से निपटने की आवश्यकता नहीं है क्योंकि यह "कॉन्फ़िगरेशन" की शिकायत पहले से मौजूद है, और आपके मौजूदा कॉन्फ़िगरेशन वर्ग का नाम बदलने से माइग्रेशन इतिहास में समस्याएं आएंगी।

आप अलग-अलग डेटाबेस को लक्षित कर सकते हैं, या एक ही, सभी विन्यास __ माइग्रेशनहिस्टर टेबल को अच्छी तरह से साझा करेंगे।


4

यदि अधिक डेटाबेस मौजूद हैं, तो PowerShell में निम्नलिखित कोड का उपयोग करें

Add-Migration Starter -context EnrollmentAppContext 
  • 'स्टार्टर' माइग्रेशन नाम है

  • 'EnrollmentAppContext' मेरे ऐप के संदर्भ में नाम है

आप वीएस में पावरशेल खोलकर कर सकते हैं: Tools->NuGet Package Manager->Package Manager Console


1
इससे मुझे मदद मिली। धन्यवाद! :)
noobprogrammer

3

PowerShell में कोड के प्रकार डेटाबेस को अपडेट करने के लिए ...

Update-Database -context EnrollmentAppContext

* यदि एक से अधिक डेटाबेस मौजूद हैं तो केवल इस कोड का उपयोग करें, अन्यथा आवश्यक नहीं है।


0

EF 4.7 वास्तव में संकेत देता है जब आप कई संदर्भों में सक्षम-माइग्रेशन चलाते हैं।

विधानसभा में एक से अधिक संदर्भ प्रकार पाए गए 'Service.Domain'।

To enable migrations for 'Service.Domain.DatabaseContext.Context1', 
use Enable-Migrations -ContextTypeName Service.Domain.DatabaseContext.Context1.
To enable migrations for 'Service.Domain.DatabaseContext.Context2',
use Enable-Migrations -ContextTypeName Service.Domain.DatabaseContext.Context2.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.