Saya mengganti nama beberapa entitas dan properti navigasinya dan menghasilkan Migrasi baru di EF 5. Seperti biasa dengan penggantian nama dalam migrasi EF, secara default akan menghapus objek dan membuatnya kembali. Bukan itu yang saya inginkan jadi saya harus membuat file migrasi dari awal.
public override void Up()
{
DropForeignKey("dbo.ReportSectionGroups", "Report_Id", "dbo.Reports");
DropForeignKey("dbo.ReportSections", "Group_Id", "dbo.ReportSectionGroups");
DropForeignKey("dbo.Editables", "Section_Id", "dbo.ReportSections");
DropIndex("dbo.ReportSectionGroups", new[] { "Report_Id" });
DropIndex("dbo.ReportSections", new[] { "Group_Id" });
DropIndex("dbo.Editables", new[] { "Section_Id" });
RenameTable("dbo.ReportSections", "dbo.ReportPages");
RenameTable("dbo.ReportSectionGroups", "dbo.ReportSections");
RenameColumn("dbo.ReportPages", "Group_Id", "Section_Id");
AddForeignKey("dbo.ReportSections", "Report_Id", "dbo.Reports", "Id");
AddForeignKey("dbo.ReportPages", "Section_Id", "dbo.ReportSections", "Id");
AddForeignKey("dbo.Editables", "Page_Id", "dbo.ReportPages", "Id");
CreateIndex("dbo.ReportSections", "Report_Id");
CreateIndex("dbo.ReportPages", "Section_Id");
CreateIndex("dbo.Editables", "Page_Id");
}
public override void Down()
{
DropIndex("dbo.Editables", "Page_Id");
DropIndex("dbo.ReportPages", "Section_Id");
DropIndex("dbo.ReportSections", "Report_Id");
DropForeignKey("dbo.Editables", "Page_Id", "dbo.ReportPages");
DropForeignKey("dbo.ReportPages", "Section_Id", "dbo.ReportSections");
DropForeignKey("dbo.ReportSections", "Report_Id", "dbo.Reports");
RenameColumn("dbo.ReportPages", "Section_Id", "Group_Id");
RenameTable("dbo.ReportSections", "dbo.ReportSectionGroups");
RenameTable("dbo.ReportPages", "dbo.ReportSections");
CreateIndex("dbo.Editables", "Section_Id");
CreateIndex("dbo.ReportSections", "Group_Id");
CreateIndex("dbo.ReportSectionGroups", "Report_Id");
AddForeignKey("dbo.Editables", "Section_Id", "dbo.ReportSections", "Id");
AddForeignKey("dbo.ReportSections", "Group_Id", "dbo.ReportSectionGroups", "Id");
AddForeignKey("dbo.ReportSectionGroups", "Report_Id", "dbo.Reports", "Id");
}
Yang saya coba lakukan hanyalah mengganti nama dbo.ReportSections
menjadi dbo.ReportPages
dan kemudian dbo.ReportSectionGroups
menjadi dbo.ReportSections
. Lalu saya perlu mengganti nama kolom kunci asing dbo.ReportPages
dari Group_Id
menjadi Section_Id
.
Saya membuang kunci asing dan indeks yang menghubungkan tabel bersama-sama, lalu saya mengganti nama tabel dan kolom kunci asing, lalu saya menambahkan indeks dan kunci asing lagi. Saya berasumsi ini akan berhasil tetapi saya mendapatkan kesalahan SQL.
Psn 15248, Level 11, Status 1, Prosedur sp_rename, Baris 215 Entah parameter @objname ambigu atau @objtype (COLUMN) yang diklaim salah. Psn 4902, Level 16, Status 1, Baris 10 Tidak dapat menemukan objek "dbo.ReportSections" karena tidak ada atau Anda tidak memiliki izin.
Saya tidak merasa mudah mencari tahu apa yang salah di sini. Wawasan apa pun akan sangat membantu.
Jawaban:
Lupakan. Saya membuat cara ini lebih rumit dari yang seharusnya.
Hanya ini yang saya butuhkan. Metode ganti nama hanya menghasilkan panggilan ke prosedur tersimpan sistem sp_rename dan saya rasa itu mengurus semuanya, termasuk kunci asing dengan nama kolom baru.
sumber
RenameColumn
menghasilkan pernyataansp_rename
T-SQL yang menggunakan penggunaanparsename
internal yang memiliki beberapa batasan. Jadi jika Anda memiliki nama tabel yang memiliki titik-titik di dalamnya misalnya "SubSystemA.Tablename" maka gunakan:RenameColumn("dbo.[SubSystemA.Tablename]", "OldColumnName", "NewColumnName");
RenameIndex(..)
dalam migrasi untuk mengganti namanyaRenameTable(..)
untuk mengganti nama FK dan PK. Kedengarannya tidak benar, tapi itulah yang berhasil bagi saya. Ini adalah metode yang membuat T-SQL (execute sp_rename ...
) yang benar. Jika Anda melakukan update-database -verbose, Anda akan melihatnya sendiri.Jika Anda tidak suka menulis / mengubah kode yang diperlukan di kelas Migrasi secara manual, Anda dapat mengikuti pendekatan dua langkah yang secara otomatis membuat
RenameColumn
kode yang diperlukan:Langkah Pertama Gunakan
ColumnAttribute
untuk memperkenalkan nama kolom baru dan kemudian tambahkan migrasi (mis.Add-Migration ColumnChanged
)Langkah-Kedua, ubah nama properti dan terapkan lagi untuk migrasi yang sama (mis.
Add-Migration ColumnChanged -force
) Di Konsol Pengelola PaketJika Anda melihat kelas Migrasi, Anda dapat melihat kode yang dibuat secara otomatis adalah
RenameColumn
.sumber
The name 'Rename_SalesArea' is used by an existing migration.
-force
parameter saat menggunakan migrasi tambahanUntuk memperluas sedikit jawaban Hossein Narimani Rad, Anda dapat mengganti nama tabel dan kolom menggunakan System.ComponentModel.DataAnnotations.Schema.TableAttribute dan System.ComponentModel.DataAnnotations.Schema.ColumnAttribute masing-masing.
Ini memiliki beberapa manfaat:
Misalnya, menambahkan
[Table("Staffs")]
:Akan menghasilkan migrasi:
sumber
Di EF Core, saya menggunakan pernyataan berikut untuk mengganti nama tabel dan kolom:
Adapun untuk mengganti nama tabel:
Adapun untuk mengganti nama kolom:
sumber
Intinya, Anda dapat mengubah migrasi yang dibuat setelah menambahkan migrasi. Kemudian lakukan update-database. Contoh telah diberikan di bawah ini:
sumber
Saya baru saja mencoba yang sama di EF6 (ganti nama entitas pertama kode). Saya hanya mengganti nama kelas dan menambahkan migrasi menggunakan konsol pengelola paket dan voila, migrasi menggunakan RenameTable (...) secara otomatis dibuat untuk saya. Saya harus mengakui bahwa saya memastikan bahwa satu-satunya perubahan pada entitas adalah mengganti namanya sehingga tidak ada kolom baru atau kolom yang diganti namanya sehingga saya tidak dapat memastikan apakah ini adalah hal EF6 atau hanya bahwa EF (selalu) dapat mendeteksi migrasi sederhana seperti itu.
sumber
DbSet
di AndaDatabaseContext
juga). Mengubah kunci utama memang menyebabkan masalah. Migrasi akan mencoba menghapusnya dan membuat yang baru. Jadi Anda perlu menyesuaikan itu dan melakukan apa yang dijawab Chev, ganti nama kolomnya.Nama tabel dan nama kolom dapat ditentukan sebagai bagian dari pemetaan
DbContext
. Maka tidak perlu melakukannya dalam migrasi.sumber