Saya pikir Anda cukup banyak di sana - Anda dapat mencari kode sumber untuk MigrateDatabaseToLatestVersion
(ini open source http://entityframework.codeplex.com/
) - ini cukup sederhana, apa yang dilakukannya cukup banyak adalah memanggil DbMigrator
- sejauh yang saya bisa lihat.
Yang harus Anda lakukan tampaknya adalah menggabungkan keduanya - gunakan satu atau yang lain sebagai dasar, tambahkan fungsionalitas lain di sana - saya pikir itu akan berfungsi dengan baik.
class CreateAndMigrateDatabaseInitializer<TContext, TConfiguration> : CreateDatabaseIfNotExists<TContext>, IDatabaseInitializer<TContext>
where TContext : DbContext
where TConfiguration : DbMigrationsConfiguration<TContext>, new()
{
private readonly DbMigrationsConfiguration _configuration;
public CreateAndMigrateDatabaseInitializer()
{
_configuration = new TConfiguration();
}
public CreateAndMigrateDatabaseInitializer(string connection)
{
Contract.Requires(!string.IsNullOrEmpty(connection), "connection");
_configuration = new TConfiguration
{
TargetDatabase = new DbConnectionInfo(connection)
};
}
void IDatabaseInitializer<TContext>.InitializeDatabase(TContext context)
{
Contract.Requires(context != null, "context");
var migrator = new DbMigrator(_configuration);
migrator.Update();
// move on with the 'CreateDatabaseIfNotExists' for the 'Seed'
base.InitializeDatabase(context);
}
protected override void Seed(TContext context)
{
}
}
sebut saja seperti ini...
Database.SetInitializer(new CreateAndMigrateDatabaseInitializer<GumpDatabase, YourNamespace.Migrations.Configuration>());
... sebenarnya, timpa (karena ini adalah implementasi umum) seperti yang Anda lakukan untuk CreateDatabaseIfNotExists
(Anda hanya memiliki 'param' tambahan untuk Konfigurasi) - dan cukup berikan 'Benih'.
class GumpDatabaseInitializer : CreateAndMigrateDatabaseInitializer<GumpDatabase, YourNamespace.Migrations.Configuration>
{
protected override void Seed(GumpDatabase context)
{
context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX Name ON Stations (Name)");
}
}
...dan menyebutnya seperti
Database.SetInitializer(new GumpDatabaseInitializer());
EDIT: Berdasarkan komentar - DbMigrator tidak boleh dijalankan dua kali. Itu selalu memeriksa (menghabiskan sedikit waktu) dan melakukan pembaruan 'kosong' dan melanjutkan. Namun untuk berjaga-jaga jika Anda ingin menghapusnya dan 'memeriksa' sebelum masuk - ini akan berfungsi (ubah bagian serupa di atas)...
var migrator = new DbMigrator(_configuration);
if (!context.Database.CompatibleWithModel(throwIfNoMetadata: false))
if (migrator.GetPendingMigrations().Any())
migrator.Update();
(ini adalah redundan/pemeriksaan ulang - salah satu if-s seharusnya sudah cukup. Istirahat di sana - dan lihat persis apa yang terjadi, itu tidak boleh masuk - setelah Db dimigrasikan. Seperti yang saya sebutkan, berfungsi dengan baik ketika saya mengujinya.
EDIT:
Ganti bagian dalam InitializeDatabase
dengan...
var doseed = !context.Database.Exists();
// && new DatabaseTableChecker().AnyModelTableExists(context);
// check to see if to seed - we 'lack' the 'AnyModelTableExists' - could be copied/done otherwise if needed...
var migrator = new DbMigrator(_configuration);
// if (doseed || !context.Database.CompatibleWithModel(throwIfNoMetadata: false))
if (migrator.GetPendingMigrations().Any())
migrator.Update();
// move on with the 'CreateDatabaseIfNotExists' for the 'Seed'
base.InitializeDatabase(context);
if (doseed)
{
Seed(context);
context.SaveChanges();
}
Ini berfungsi di sekitar (setengah jalan) bukan penyemaian - jika migrasi berjalan lebih dulu. Dan migrasi harus menjadi yang pertama, jika tidak, Anda memiliki masalah.
Anda masih perlu melakukannya dengan benar - ini adalah intinya jika tidak semua yang mungkin Anda perlukan - tetapi jika ada masalah dengan MySQL dll., mungkin lebih banyak pekerjaan kaki di sini.
Catatan: Masih seeding tidak memanggil jika Anda memiliki db, tetapi kosong. Masalahnya adalah pencampuran dua penginisialisasi yang berbeda. Jadi, Anda harus menyelesaikannya - baik dengan menerapkan apa yang Create... lakukan di dalam (panggilan itu tidak dapat kami panggil) atau yang lainnya.