Bagaimana cara mengaktifkan migrasi Entity Framework 5 (versi 5.0.0) untuk beberapa konteks DB dalam proyek yang sama, di mana setiap konteks sesuai dengan database-nya sendiri? Ketika saya menjalankan Enable-Migrations
di konsol PM (Visual Studio 2012), ada kesalahan karena terdapat beberapa konteks:
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.
Jika saya menjalankan, Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext
saya tidak diizinkan untuk menjalankan Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext
karena migrasi sudah ada:Migrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter.
Jawaban:
Panggilan kedua untuk Aktifkan-Migrasi gagal karena file Configuration.cs sudah ada. Jika Anda mengganti nama kelas dan file itu, Anda harus dapat menjalankan Enable-Migrations yang kedua, yang akan membuat Configuration.cs lain.
Anda kemudian perlu menentukan konfigurasi mana yang ingin Anda gunakan saat memperbarui database.
sumber
Selain apa yang disarankan oleh @ckal, penting untuk memberi setiap Configuration.cs yang berganti nama, namespace sendiri. Jika tidak, EF akan mencoba menerapkan migrasi ke konteks yang salah.
Berikut adalah langkah-langkah spesifik yang berhasil bagi saya.
Jika Migrasi kacau dan Anda ingin membuat "baseline" baru:
Membuat migrasi awal:
Di Konsol Pengelola Paket:
Di Penjelajah Solusi: Ubah nama Migrations.Configuration.cs menjadi Migrations.ConfigurationA.cs. Ini akan secara otomatis mengganti nama konstruktor jika menggunakan Visual Studio. Pastikan ya. Edit ConfigurationA.cs: Ubah namespace ke NamespaceOfContext.Migrations.MigrationsA
Di Solution Explorer: Ubah nama Migrations.Configuration.cs menjadi Migrations.ConfigurationB.cs. Sekali lagi, pastikan konstruktor juga diganti namanya dengan benar. Edit ConfigurationB.cs: Ubah namespace ke NamespaceOfContext.Migrations.MigrationsB
Langkah-langkah untuk membuat skrip migrasi di Package Manager Console:
Jalankan perintah
atau -
Tidaklah mengapa untuk menjalankan kembali perintah ini sampai perubahan diterapkan ke DB.
Jalankan skrip pada database lokal yang diinginkan, atau jalankan Update-Database tanpa -Script untuk diterapkan secara lokal:
atau -
sumber
Saya baru saja mengalami masalah yang sama dan saya menggunakan solusi berikut (semua dari Package Manager Console)
Ini akan membuat 2 folder terpisah di folder Migrasi. Masing-masing akan berisi
Configuration.cs
file yang dihasilkan . Sayangnya Anda masih harus mengganti namaConfiguration.cs
file tersebut jika tidak akan ada keluhan tentang memiliki dua di antaranya. Saya mengganti nama file saya menjadiConfigA.cs
danConfigB.cs
EDIT : (courtesy Kevin McPheat) Ingat saat mengganti nama file Configuration.cs, juga ganti nama kelas dan konstruktor / EDIT
Dengan struktur ini Anda bisa langsung melakukannya
Yang akan membuat file kode untuk migrasi di dalam folder di sebelah file konfigurasi (ini bagus untuk menyimpan file-file itu bersama-sama)
Dan yang tak kalah pentingnya kedua perintah itu akan menerapkan migrasi yang benar ke database yang sesuai.
EDIT 08 Feb, 2016: Saya telah melakukan sedikit pengujian dengan EF7 versi 7.0.0-rc1-16348
Saya tidak bisa mengaktifkan opsi -o | --outputDir. Itu terus memberi
Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument
Namun tampaknya saat pertama kali ditambahkan, migrasi ditambahkan ke folder Migrasi, dan migrasi berikutnya untuk konteks lain secara otomatis dimasukkan ke dalam subdolder migrasi.
Nama asli
ContextA
sepertinya melanggar beberapa konvensi penamaan jadi sekarang saya menggunakanContextAContext
danContextBContext
. Dengan menggunakan nama-nama ini, Anda dapat menggunakan perintah berikut: (perhatikan bahwa dnx saya masih berfungsi dari konsol manajer paket dan saya tidak suka membuka jendela CMD terpisah untuk melakukan migrasi)Ini akan membuat snapshot model dan migrasi awal di
Migrations
folder untukContextAContext
. Ini akan membuat folder bernama yangContextB
berisi file-file ini untukContextBContext
Saya menambahkan
ContextA
folder secara manual dan memindahkan file migrasi dariContextAContext
ke folder itu. Kemudian saya mengganti nama namespace di dalam file-file itu (file snapshot, migrasi awal dan perhatikan bahwa ada file ketiga di bawah file migrasi awal ... designer.cs). Saya harus menambahkan.ContextA
namespace, dan dari sana framework menanganinya secara otomatis lagi.Menggunakan perintah berikut akan membuat migrasi baru untuk setiap konteks
dan file yang dihasilkan disimpan di folder yang benar.
sumber
add-migration
akan meminta Anda untukName
. Ini membuat sayaConfigurationTypeName
sedikit tersinggung karena saya sudah menyediakan dan menjadi sedikit kesal ketika baru saja dikatakanName:
. Tapi tentu saja Nama yang diinginkannya adalah deskripsi perubahan yang 'dapat dibaca manusia' - mis.AddedProducts
atauIncreaseLengthOfNameFields
. Di folder Migration Anda akan mendapatkan ini sebagai bagian dari nama kelas sehingga mudah untuk melihat apa itu. Jadi, efeknyaName
seperti komentar check-in.Jika Anda sudah memiliki "Konfigurasi" dengan banyak migrasi dan ingin tetap seperti ini, Anda selalu dapat membuat kelas "Konfigurasi" baru, beri nama lain, seperti
lalu berikan perintah saja
dan EF akan mengatur migrasi tanpa masalah. Terakhir perbarui database Anda, mulai sekarang, EF akan mengeluh jika Anda tidak memberi tahu dia konfigurasi mana yang ingin Anda perbarui:
Selesai.
Anda tidak perlu berurusan dengan Aktifkan-Migrasi karena akan mengeluh "Konfigurasi" sudah ada, dan mengganti nama kelas Konfigurasi yang ada akan membawa masalah pada riwayat migrasi.
Anda dapat menargetkan database yang berbeda, atau database yang sama, semua konfigurasi akan berbagi tabel __MigrationHistory dengan baik.
sumber
Jika ada lebih banyak database, gunakan kode berikut di PowerShell
'Pemula' adalah Nama Migrasi
'EnrollmentAppContext' adalah nama Konteks aplikasi saya
Anda dapat membuka PowerShell di VS dengan melakukan:
Tools->NuGet Package Manager->Package Manager Console
sumber
Untuk memperbarui tipe database kode berikut di PowerShell ...
* Jika ada lebih dari satu database, gunakan hanya kode ini, jika tidak, tidak perlu ..
sumber
EF 4.7 sebenarnya memberi petunjuk saat Anda menjalankan Enable-migrations di berbagai konteks.
Lebih dari satu jenis konteks ditemukan di rakitan 'Service.Domain'.
sumber