Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara membuat penginisialisasi untuk membuat dan memigrasi database mysql?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengambil dan menampilkan Data untuk Setiap Pengguna Terdaftar di PHP menggunakan PDO

  2. Bagaimana cara menyimpan Simbol Euro di database mysql?

  3. Bagaimana cara membatalkan eksekusi skrip MySQL (mungkin meningkatkan kesalahan)?

  4. Apakah ada perbedaan antara DATE_SUB() dan menggunakan operator aritmatika untuk perhitungan datetime?

  5. Bagaimana saya bisa melihat nilai spesifik dari sql_mode?