Aynı DB'de ve EF 6'da Uygulama ve Code First Migrations İçinde Birden Çok DB Bağlamı


95

Entity Framework'te yeniyim. EF 6 kullanan bir MVC Uygulaması kurmaya çalışıyorum. Code First Migrations kullanıyorum. Uygulamada Alanlar kullanıyorum ve onu bölmek için her alanda farklı DbContexts olmasını istiyorum. EF 6'nın ContextKey'e sahip olduğunu biliyorum, ancak nasıl kullanılacağına dair tam bilgi bulamıyorum. Şu anda taşıma işlemlerini aynı anda yalnızca bir bağlam kullanabilirim.

EF'e benim gibi yeni bir kişinin anlayıp kullanması için yeterince detaylı bir örnek verebilir misiniz?

Yanıtlar:


177

Entity Framework 6 DbContext, -ContextTypeNameve -MigrationsDirectorybayraklarını ekleyerek birden çok URL desteği ekledi . Paket Yöneticisi Konsolumdaki komutları çalıştırdım ve çıktıyı aşağıya yapıştırdım ...

DbContextProjenizde 2 s varsa ve çalıştırırsanız enable-migrations, bir hata alırsınız (muhtemelen zaten bildiğiniz gibi):

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.

Yani enable-migrationsher biri için DbContextayrı ayrı koşmanız gerekiyor. Ve Configuration.csoluşturulacak her dosya için bir klasör belirlemelisiniz ...

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.

Her birine geçiş eklemek için DbContext, bunu, Configurationsınıfın tam olarak nitelenmiş adını belirterek yaparsınız :

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.

Ve update-databaseaynı şekilde koşarsınız :

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.

Bu yardımcı olur umarım.


Her bağlam için ayrı bir bağlantı dizesine sahip olmam gerekir mi yoksa bunun bir yolu var mı?
Lrayh

3
Aynı bağlantı dizesini paylaşabilirler. Ancak aynı tablolarla eşleşmediklerinden emin olmak istersiniz.
Anthony Chu

Aynı tabloya eşleme yaparlarsa, hangi geçişin ilk olarak çalışacağını yine de tanımlayabilir ve geçiş dosyasının tabloyu oluşturmasını ve hangisinin ikinci çalışacağını ve zaten mevcut tabloyu oluşturmaması için onu değiştirmesini bırakabilirsiniz. Daha sonra , doğru sırada çalıştırmak için her bir bağlamın MigrateDatabaseToLatestVersionforzingini kullanabilir ctx.Database.initialize()veya Update-Databasekomutu elle doğru sırada çalıştırabilirsiniz. (Ve tersi, önceki sürüme bir db geçişi yaparsanız). Bu "tehlikeli" ama yapılabilir.
JotaBe

Bu yüzden projeme geçişler ekledim ve ApplicationDbContext'ten farklı bir bağlam oluşturdum. Yaklaşık 6 ay boyunca siteyle ilgili veriler olan bu bağlamı kullanmaya devam ettim, sonra ApplicationUser'ımla uğraşmaya başlama zamanı geldi. Temel oturum açma ve kaydım çalışıyordu, ancak bazı ek alanlar eklemek için kullanıcı sınıfını genişletmek istedim. Bu yanıt, bu bağlam için yeni bir geçiş yapılandırması oluşturmada çok yardımcı oldu. Teşekkür ederim! #
1up

1
Bu kısa ama gereğinden fazla cevap için size bir +10 verebilirsem, yapardım, teşekkürler @AnthonyChu.
Karim AG
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.