Pomelo.entityframeworkcore.mysql: Mengganti Nama Entitas

Dibuat pada 20 Feb 2020  ·  3Komentar  ·  Sumber: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

Mengganti nama entitas akan jatuh dan membuat tabel alih-alih mengganti namanya saja.

closed-question type-question

Komentar yang paling membantu

Ini adalah batasan yang melekat pada EF, bukan Pomelo secara langsung. EF biasanya tidak dapat membedakan antara drop/create tabel, dan rename.

Trik untuk mengetahui bahwa itu adalah penggantian nama adalah dengan mengatur nama tabel secara manual, baik melalui atribut pada kelas entitas, atau melalui API lancar OnModelCreating.

Urutannya seperti:

  1. Menggunakan nama entitas asli , atur nama tabel ke nilai baru. Coba pastikan nama baru ini benar untuk entitas baru, atau Anda mungkin akan mendapatkan migrasi tambahan.

Misal builder.Entity<OriginalEntity>().ToTable("RenamedEntity");

  1. Menghasilkan migrasi. Ini akan membuat migrasi tabel ganti nama yang benar untuk entitas.
    Pastikan migrasi ini benar. Jika Anda menggunakan Pomelo 2.2.6, periksa entri migrationBuilder.DropPrimaryKey dan AddPrimaryKey dan hapus entri tersebut, karena ini tidak diperlukan untuk MySQL dan akan menyebabkan masalah dalam menghasilkan skrip SQL idempoten. Ini diperbaiki dalam 3.1.

  2. Ganti nama kelas entitas yang sebenarnya.

  3. Buat migrasi lain untuk memperbarui snapshot model dengan nama entitas baru.

Jika Anda kemudian ingin menghapus .ToTable("RenamedEntity"); untuk kembali ke penamaan tabel berbasis konvensi:

  1. Hapus .ToTable("RenamedEntity"); . Jika Anda mendapatkan nama tabel yang benar, nama berbasis konvensi harus sama dengan nama saat ini.

  2. Buat migrasi terakhir untuk memverifikasi bahwa tabel tidak diganti namanya lagi. Jika ya, kembalikan semua langkah, perbaiki namanya, dan ulangi. Jika migrasi kosong, Anda dapat mengembalikannya.

Saya belum mengujinya, tetapi Anda mungkin dapat melakukan ini dalam urutan terbalik. YAITU:

  1. Ganti nama entitas, dan tambahkan .ToTable dengan nama tabel saat ini
  2. Menghasilkan migrasi.
  3. Hapus atribut .ToTable
  4. Hasilkan migrasi lain.

Untuk informasi lebih lanjut, lihat pertanyaan stack overflow ini:

https://stackoverflow.com/questions/13296996/entity-framework-migrations-renaming-tables-and-columns

Semua 3 komentar

Ini adalah batasan yang melekat pada EF, bukan Pomelo secara langsung. EF biasanya tidak dapat membedakan antara drop/create tabel, dan rename.

Trik untuk mengetahui bahwa itu adalah penggantian nama adalah dengan mengatur nama tabel secara manual, baik melalui atribut pada kelas entitas, atau melalui API lancar OnModelCreating.

Urutannya seperti:

  1. Menggunakan nama entitas asli , atur nama tabel ke nilai baru. Coba pastikan nama baru ini benar untuk entitas baru, atau Anda mungkin akan mendapatkan migrasi tambahan.

Misal builder.Entity<OriginalEntity>().ToTable("RenamedEntity");

  1. Menghasilkan migrasi. Ini akan membuat migrasi tabel ganti nama yang benar untuk entitas.
    Pastikan migrasi ini benar. Jika Anda menggunakan Pomelo 2.2.6, periksa entri migrationBuilder.DropPrimaryKey dan AddPrimaryKey dan hapus entri tersebut, karena ini tidak diperlukan untuk MySQL dan akan menyebabkan masalah dalam menghasilkan skrip SQL idempoten. Ini diperbaiki dalam 3.1.

  2. Ganti nama kelas entitas yang sebenarnya.

  3. Buat migrasi lain untuk memperbarui snapshot model dengan nama entitas baru.

Jika Anda kemudian ingin menghapus .ToTable("RenamedEntity"); untuk kembali ke penamaan tabel berbasis konvensi:

  1. Hapus .ToTable("RenamedEntity"); . Jika Anda mendapatkan nama tabel yang benar, nama berbasis konvensi harus sama dengan nama saat ini.

  2. Buat migrasi terakhir untuk memverifikasi bahwa tabel tidak diganti namanya lagi. Jika ya, kembalikan semua langkah, perbaiki namanya, dan ulangi. Jika migrasi kosong, Anda dapat mengembalikannya.

Saya belum mengujinya, tetapi Anda mungkin dapat melakukan ini dalam urutan terbalik. YAITU:

  1. Ganti nama entitas, dan tambahkan .ToTable dengan nama tabel saat ini
  2. Menghasilkan migrasi.
  3. Hapus atribut .ToTable
  4. Hasilkan migrasi lain.

Untuk informasi lebih lanjut, lihat pertanyaan stack overflow ini:

https://stackoverflow.com/questions/13296996/entity-framework-migrations-renaming-tables-and-columns

Pada dasarnya, ada heuristik yang diterapkan, yang dapat mendeteksi perubahan nama tabel dalam kasus _some_.

Tetapi mengganti nama adalah salah satu operasi tersebut, di mana Anda pasti ingin memeriksa kode migrasi yang dihasilkan setelahnya dan mengubah panggilan DropTable dan CreateTable menjadi RenameTable jika perlu.

EF Core telah mengubah nama tabel seperti migrasi yang dibuat secara otomatis ini.

        migrationBuilder.DropPrimaryKey(
            name: "PK_LogFieldsConfiguration",
            table: "LogFieldsConfiguration");

        migrationBuilder.RenameTable(
            name: "LogFieldsConfiguration",
            newName: "LogFieldsConfigurations");

        migrationBuilder.AddPrimaryKey(
            name: "PK_LogFieldsConfigurations",
            table: "LogFieldsConfigurations",
            column: "Id");
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

mason-chase picture mason-chase  ·  4Komentar

lauxjpn picture lauxjpn  ·  3Komentar

findmoon picture findmoon  ·  3Komentar

lebartha picture lebartha  ·  3Komentar

a641545621 picture a641545621  ·  3Komentar