Кілька контекстів БД в одній БД та застосунку в EF 6 та Перші міграції коду


94

Я новачок у Entity Framework. Я намагаюся встановити програму MVC, яка використовує EF 6. Я використовую міграції Code First. Я використовую області в додатку і хотів би мати різні DbContexts у кожній області, щоб розбити його. Я знаю, що EF 6 має ContextKey, але я не можу знайти повної інформації про те, як ним користуватися. В даний час я можу використовувати міграції лише один контекст.

Чи може хтось навести приклад із достатньою деталізацією, щоб нова людина, як я, зрозумів і використав EF.

Відповіді:


176

Entity Framework 6 додав підтримку декількох DbContexts, додавши прапори -ContextTypeNameі -MigrationsDirectory. Я просто запустив команди в консолі Package Manager і вставив вихід нижче ...

Якщо у вас є 2 DbContextс у вашому проекті, і ви запустите 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команду вручну у правильному порядку. (І зворотне, якщо ви виконуєте міграцію дБ до попередньої версії). Це "небезпечно", але це можна зробити.
JotaBe

Тому я додав міграції до свого проекту та створив контекст, відмінний від ApplicationDbContext. Я продовжував використовувати той контекст, який стосувався даних про сайт близько 6 місяців, тоді прийшов час почати возитися з моїм ApplicationUser. Моє основне вхід та реєстрація працювали, але я хотів розширити клас користувача, щоб додати кілька додаткових полів. Ця відповідь була дуже корисною для налаштування нової конфігурації міграції для цього контексту. Дякую! # 1up
Ерік Бішард

1
якщо я можу дати вам +10 за цю коротку, але більш ніж достатню відповідь, я б хотів, спасибі @AnthonyChu.
Karim AG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.