Beberapa Konteks DB dalam DB dan Aplikasi yang Sama di EF 6 dan Migrasi Pertama Kode

94

Saya baru mengenal Entity Framework. Saya mencoba menyiapkan Aplikasi MVC yang menggunakan EF 6. Saya menggunakan Migrasi Pertama Kode. Saya menggunakan Area di aplikasi dan ingin memiliki DbContext yang berbeda di setiap area untuk memecahnya. Saya tahu EF 6 memiliki ContextKey, tetapi saya tidak dapat menemukan informasi lengkap tentang cara menggunakannya. Saat ini saya hanya dapat menggunakan migrasi satu konteks dalam satu waktu.

Adakah yang bisa memberi contoh dengan detail yang cukup untuk dipahami dan digunakan oleh orang baru EF seperti saya.

Lrayh
sumber

Jawaban:

176

Entity Framework 6 menambahkan dukungan untuk beberapa DbContexts dengan menambahkan tanda -ContextTypeNamedan -MigrationsDirectory. Saya baru saja menjalankan perintah di Package Manager Console saya dan menempelkan output di bawah ...

Jika Anda memiliki 2 DbContextdetik dalam proyek Anda dan dijalankan enable-migrations, Anda akan mendapatkan kesalahan (seperti yang mungkin sudah Anda ketahui):

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.

Jadi, Anda harus menjalankan enable-migrationspada masing-masing DbContextsecara terpisah. Dan Anda harus menentukan folder untuk setiap Configuration.csfile yang akan dibuat ...

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.

Untuk menambahkan migrasi untuk masing-masing DbContext, Anda melakukannya seperti ini dengan menentukan nama Configurationkelas yang sepenuhnya memenuhi syarat :

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.

Dan Anda menjalankan update-databasecara yang sama:

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.

Semoga ini membantu.

Anthony Chu
sumber
Apakah saya harus memiliki string koneksi terpisah untuk setiap konteks atau adakah cara untuk mengatasinya?
Lrayh
3
Mereka dapat berbagi string koneksi yang sama. Tapi Anda ingin memastikan mereka tidak memetakan ke tabel yang sama.
Anthony Chu
Jika mereka memetakan ke tabel yang sama, Anda masih dapat menentukan migrasi mana yang akan dijalankan lebih dulu, dan membiarkan file migrasinya membuat tabel, dan mana yang akan berjalan kedua, dan memodifikasinya sehingga tidak membuat tabel yang sudah keluar. Anda kemudian dapat menggunakan MigrateDatabaseToLatestVersionforzing ctx.Database.initialize()dari setiap konteks untuk berjalan dalam urutan yang benar, atau menjalankan Update-Databaseperintah dengan tangan dalam urutan yang benar. (Dan sebaliknya, jika Anda melakukan migrasi db ke versi sebelumnya). Itu "berbahaya" tapi bisa dilakukan.
JotaBe
Jadi saya telah menambahkan migrasi ke proyek saya dan membuat konteks yang berbeda dari ApplicationDbContext. Saya melanjutkan menggunakan konteks itu yang merupakan data terkait situs selama sekitar 6 bulan, kemudian tiba saatnya untuk mulai bermain-main dengan ApplicationUser saya. Login dan registrasi dasar saya berfungsi, tetapi saya ingin memperluas kelas pengguna untuk menambahkan beberapa bidang tambahan. Jawaban ini sangat membantu dalam menyiapkan konfigurasi migrasi baru untuk konteks tersebut. Terima kasih! # 1up
Eric Bishard
1
jika saya dapat memberi Anda +10 untuk jawaban yang singkat tetapi lebih dari cukup ini, saya akan, Terima kasih @AnthonyChu.
Karim AG