एक ही DB में एकाधिक DB संदर्भ और EF 6 और कोड पहले माइग्रेशन में अनुप्रयोग


94

मैं एंटिटी फ्रेमवर्क में नया हूं। मैं एक MVC एप्लिकेशन को सेटअप करने का प्रयास कर रहा हूं जो EF 6 का उपयोग करता है। मैं कोड फर्स्ट माइग्रेशन का उपयोग कर रहा हूं। मैं एप्लिकेशन में क्षेत्रों का उपयोग कर रहा हूं और इसे अलग करने के लिए प्रत्येक क्षेत्र में अलग-अलग डीबीकोनटेक्स होना चाहूंगा। मुझे पता है कि EF 6 में ContextKey है, लेकिन मुझे इसका उपयोग कैसे करना है, इसकी पूरी जानकारी नहीं मिल सकती है। वर्तमान में मैं केवल एक समय में एक ही संदर्भ में माइग्रेशन का उपयोग कर सकता हूं।

क्या कोई नया व्यक्ति ईएफ को समझने और उपयोग करने के लिए पर्याप्त विवरण के साथ एक उदाहरण दे सकता है।

जवाबों:


176

इकाई फ्रेमवर्क 6 DbContextमें -ContextTypeNameऔर -MigrationsDirectoryझंडे जोड़कर कई एस के लिए समर्थन जोड़ा गया । मैंने सिर्फ अपने पैकेज मैनेजर कंसोल में कमांड्स को चलाया और नीचे दिए गए आउटपुट को पेस्ट किया ...

यदि DbContextआपके प्रोजेक्ट में 2 s हैं और आप चलते हैं enable-migrations, तो आपको एक त्रुटि मिलेगी (जैसा कि आप शायद पहले से जानते हैं):

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

इसलिए आपको enable-migrationsप्रत्येक को DbContextअलग - अलग चलाना होगा । और आपको Configuration.csउत्पन्न होने वाली प्रत्येक फ़ाइल के लिए एक फ़ोल्डर निर्दिष्ट करना होगा ...

PM> Enable-Migrations -ContextTypeName ApplicationDbContext -MigrationsDirectory Migrations\ApplicationDbContext
Checking if the context targets an existing database...
Code First Migrations enabled for project WebApplication3.

PM> Enable-Migrations -ContextTypeName AnotherDbContext -MigrationsDirectory Migrations\AnotherDbContext
Checking if the context targets an existing database...
Code First Migrations enabled for project WebApplication3.

प्रत्येक के लिए माइग्रेशन जोड़ने के लिए DbContext, आप इसे Configurationकक्षा के पूरी तरह से योग्य नाम निर्दिष्ट करके ऐसा करते हैं :

PM> Add-Migration -ConfigurationTypeName WebApplication3.Migrations.ApplicationDbContext.Configuration "InitialDatabaseCreation"
Scaffolding migration 'InitialDatabaseCreation'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration InitialDatabaseCreation' again.

PM> Add-Migration -ConfigurationTypeName WebApplication3.Migrations.AnotherDbContext.Configuration "InitialDatabaseCreation"
Scaffolding migration 'InitialDatabaseCreation'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration InitialDatabaseCreation' again.

और आप update-databaseउसी तरह से चलते हैं :

PM> Update-Database -ConfigurationTypeName WebApplication3.Migrations.ApplicationDbContext.Configuration
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201402032113124_InitialDatabaseCreation].
Applying explicit migration: 201402032113124_InitialDatabaseCreation.
Running Seed method.

PM> Update-Database -ConfigurationTypeName WebApplication3.Migrations.AnotherDbContext.Configuration
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201402032113383_InitialDatabaseCreation].
Applying explicit migration: 201402032113383_InitialDatabaseCreation.
Running Seed method.

उम्मीद है की यह मदद करेगा।


क्या मेरे पास प्रत्येक संदर्भ के लिए एक अलग कनेक्शन स्ट्रिंग है या क्या इसके आसपास कोई रास्ता है?
Lrayh

3
वे एक ही कनेक्शन स्ट्रिंग साझा कर सकते हैं। लेकिन आप यह सुनिश्चित करना चाहते हैं कि वे एक ही टेबल पर मैप न करें।
एंथनी चू

यदि वे एक ही टेबल पर मैप करते हैं, तो आप अभी भी परिभाषित कर सकते हैं कि कौन सा माइग्रेशन पहले चलेगा, और अपनी माइग्रेशन फ़ाइल को टेबल बनाने के लिए छोड़ दें, और जो दूसरा चलाएगा, और इसे संशोधित करेगा ताकि यह पहले से ही बाहर निकलने वाली तालिका न बनाए। फिर आप प्रत्येक संदर्भ के MigrateDatabaseToLatestVersionफोर्जिंग का उपयोग ctx.Database.initialize()सही क्रम में चलाने के लिए कर सकते हैं, या Update-Databaseसही क्रम में हाथ से कमांड चला सकते हैं । (और उल्टा, यदि आप पिछले संस्करण में db माइग्रेशन करते हैं)। यह "खतरनाक" है, लेकिन किया जा सकता है।
कोटाबाई

इसलिए मैंने अपने प्रोजेक्ट में माइग्रेशन जोड़ा था और ApplicationDbContext से अलग एक संदर्भ बनाया। मैं उस संदर्भ का उपयोग करने के लिए गया था जो लगभग 6 महीने के लिए साइट से संबंधित डेटा था, फिर यह मेरे ApplicationUser के साथ खिलवाड़ शुरू करने का समय आया। मेरा मूल लॉगिन और पंजीकरण काम कर रहा था, लेकिन मैं कुछ अतिरिक्त क्षेत्रों को जोड़ने के लिए उपयोगकर्ता वर्ग का विस्तार करना चाहता था। यह उत्तर उस संदर्भ के लिए एक नया माइग्रेशन कॉन्फ़िगरेशन सेट करने में बहुत मददगार था। धन्यवाद! # 1up
एरिक बिशर्ड

1
अगर मैं आपको इस संक्षिप्त लेकिन पर्याप्त उत्तर से अधिक के लिए एक +10 दे सकता हूं, धन्यवाद @AnthonyChu।
करीम एजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.