Pertanyaan Kerangka Entitas Migrasi mengganti nama tabel dan kolom


Saya mengganti nama beberapa entitas dan properti navigasi mereka dan menghasilkan Migrasi baru di EF 5. Seperti biasa dengan mengganti nama dalam migrasi EF, secara default itu akan menjatuhkan objek dan membuatnya kembali. Bukan itu yang saya inginkan jadi saya cukup banyak harus membangun 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 untuk dbo.ReportPages lalu dbo.ReportSectionGroups untuk dbo.ReportSections. Lalu saya perlu mengganti nama kolom kunci asing dbo.ReportPages dari Group_Id untuk Section_Id.

Saya menjatuhkan kunci dan indeks asing yang menghubungkan tabel bersama, kemudian saya mengganti nama tabel dan kolom kunci asing, kemudian saya menambahkan indeks dan kunci asing lagi. Saya berasumsi ini akan bekerja tetapi saya mendapatkan kesalahan SQL.

Msg 15248, Tingkat 11, Negara 1, Prosedur sp_rename, Baris 215   Entah parameter @objname ambigu atau @objtype diklaim (COLUMN) salah.   Msg 4902, Level 16, Negara 1, Jalur 10   Tidak dapat menemukan objek "dbo.ReportSections" karena tidak ada atau Anda tidak memiliki izin.

Saya tidak memiliki waktu yang mudah untuk mencari tahu apa yang salah di sini. Wawasan apa pun akan sangat membantu.


76
2017-11-08 20:12


asal


Jawaban:


Lupakan. Saya membuat cara ini lebih rumit dari yang seharusnya.

Ini semua yang saya butuhkan. Metode rename hanya menghasilkan panggilan ke sp_rename sistem yang tersimpan prosedur dan saya kira itu mengurus semuanya, termasuk kunci asing dengan nama kolom baru.

public override void Up()
{
    RenameTable("ReportSections", "ReportPages");
    RenameTable("ReportSectionGroups", "ReportSections");
    RenameColumn("ReportPages", "Group_Id", "Section_Id");
}

public override void Down()
{
    RenameColumn("ReportPages", "Section_Id", "Group_Id");
    RenameTable("ReportSections", "ReportSectionGroups");
    RenameTable("ReportPages", "ReportSections");
}

108
2017-11-08 20:27



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 Menggunakan ColumnAttribute untuk memperkenalkan nama kolom baru dan menambahkan migrasi (mis. Add-Migration ColumnChanged)

public class ReportPages
{
    [Column("Section_Id")]                 //Section_Id
    public int Group_Id{get;set}
}

Langkah-Dua ubah nama properti dan lagi berlaku untuk migrasi yang sama (mis. Add-Migration ColumnChanged) di Konsol Manajer Paket

public class ReportPages
{
    [Column("Section_Id")]                 //Section_Id
    public int Section_Id{get;set}
}

Jika Anda melihat kelas Migrasi Anda dapat melihat kode otomatis yang dihasilkan RenameColumn.


19
2017-07-23 07:40



Untuk memperluas sedikit pada 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:

  1. Ini tidak hanya akan membuat migrasi nama secara otomatis, tetapi
  2. itu juga akan dengan nikmat menghapus kunci asing dan membuatnya ulang dengan nama tabel dan kolom baru, memberikan kunci asing dan membatasi nama yang tepat.
  3. Semua ini tanpa kehilangan data tabel apa pun

Misalnya, menambahkan [Table("Staffs")]:

[Table("Staffs")]
public class AccountUser
{
    public long Id { get; set; }

    public long AccountId { get; set; }

    public string ApplicationUserId { get; set; }

    public virtual Account Account { get; set; }

    public virtual ApplicationUser User { get; set; }
}

Akan menghasilkan migrasi:

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropForeignKey(
            name: "FK_AccountUsers_Accounts_AccountId",
            table: "AccountUsers");

        migrationBuilder.DropForeignKey(
            name: "FK_AccountUsers_AspNetUsers_ApplicationUserId",
            table: "AccountUsers");

        migrationBuilder.DropPrimaryKey(
            name: "PK_AccountUsers",
            table: "AccountUsers");

        migrationBuilder.RenameTable(
            name: "AccountUsers",
            newName: "Staffs");

        migrationBuilder.RenameIndex(
            name: "IX_AccountUsers_ApplicationUserId",
            table: "Staffs",
            newName: "IX_Staffs_ApplicationUserId");

        migrationBuilder.RenameIndex(
            name: "IX_AccountUsers_AccountId",
            table: "Staffs",
            newName: "IX_Staffs_AccountId");

        migrationBuilder.AddPrimaryKey(
            name: "PK_Staffs",
            table: "Staffs",
            column: "Id");

        migrationBuilder.AddForeignKey(
            name: "FK_Staffs_Accounts_AccountId",
            table: "Staffs",
            column: "AccountId",
            principalTable: "Accounts",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);

        migrationBuilder.AddForeignKey(
            name: "FK_Staffs_AspNetUsers_ApplicationUserId",
            table: "Staffs",
            column: "ApplicationUserId",
            principalTable: "AspNetUsers",
            principalColumn: "Id",
            onDelete: ReferentialAction.Restrict);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropForeignKey(
            name: "FK_Staffs_Accounts_AccountId",
            table: "Staffs");

        migrationBuilder.DropForeignKey(
            name: "FK_Staffs_AspNetUsers_ApplicationUserId",
            table: "Staffs");

        migrationBuilder.DropPrimaryKey(
            name: "PK_Staffs",
            table: "Staffs");

        migrationBuilder.RenameTable(
            name: "Staffs",
            newName: "AccountUsers");

        migrationBuilder.RenameIndex(
            name: "IX_Staffs_ApplicationUserId",
            table: "AccountUsers",
            newName: "IX_AccountUsers_ApplicationUserId");

        migrationBuilder.RenameIndex(
            name: "IX_Staffs_AccountId",
            table: "AccountUsers",
            newName: "IX_AccountUsers_AccountId");

        migrationBuilder.AddPrimaryKey(
            name: "PK_AccountUsers",
            table: "AccountUsers",
            column: "Id");

        migrationBuilder.AddForeignKey(
            name: "FK_AccountUsers_Accounts_AccountId",
            table: "AccountUsers",
            column: "AccountId",
            principalTable: "Accounts",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);

        migrationBuilder.AddForeignKey(
            name: "FK_AccountUsers_AspNetUsers_ApplicationUserId",
            table: "AccountUsers",
            column: "ApplicationUserId",
            principalTable: "AspNetUsers",
            principalColumn: "Id",
            onDelete: ReferentialAction.Restrict);
    }

6
2018-05-31 02:16



Saya baru saja mencoba yang sama di EF6 (mengubah nama entitas kode pertama). Saya hanya mengganti nama kelas dan menambahkan migrasi menggunakan konsol manajer paket dan voila, migrasi menggunakan RenameTable (...) secara otomatis dihasilkan untuk saya. Saya harus mengakui bahwa saya memastikan satu-satunya perubahan pada entitas adalah mengganti nama sehingga tidak ada kolom baru atau berganti nama kolom sehingga saya tidak dapat memastikan apakah ini adalah hal EF6 atau hanya bahwa EF (selalu) dapat mendeteksi migrasi sederhana seperti itu.


2
2017-12-21 11:42



Di EF Core (2.0), saya menggunakan pernyataan berikut untuk mengganti nama tabel dan kolom:

Seperti untuk mengganti nama tabel:

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.RenameTable(name: "OldTableName", schema: "dbo", newName: "NewTableName", newSchema: "dbo");
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.RenameTable(name: "NewTableName", schema: "dbo", newName: "OldTableName", newSchema: "dbo");
    }

Adapun mengganti nama kolom:

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.RenameColumn(name: "OldColumnName", table: "TableName", newName: "NewColumnName", schema: "dbo");
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.RenameColumn(name: "NewColumnName", table: "Orders", newName: "OldColumnName", schema: "dbo");
    }

2
2018-06-16 08:16



Nama tabel dan nama kolom dapat ditentukan sebagai bagian dari pemetaan DbContext. Maka tidak perlu melakukannya dalam migrasi.

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Restaurant>()
            .HasMany(p => p.Cuisines)
            .WithMany(r => r.Restaurants)
            .Map(mc =>
            {
                mc.MapLeftKey("RestaurantId");
                mc.MapRightKey("CuisineId");
                mc.ToTable("RestaurantCuisines");
            });
     }
}

0
2018-05-07 08:26