在执行update-database时,MVC5中出现RenameIndexOperation错误

时间:2014-08-11 22:18:57

标签: mysql asp.net-mvc database migration

我有一个名为Category的模型,你可以在下面找到它的定义:

public class Category
{
    [Key]
    public int CategoryID { get; set; }

    public string CategoryName { get; set; }

    public virtual ICollection<Subcategory> Subcategories { get; set; }
}

子类别是我的另一个模型,它以类似的方式定义。之后,我使用这个模型创建了一个新的控制器,并将控制器命名为CategoriesController。然后我运行命令:Add-Migration Categories,它创建了这个:

public partial class Categories : DbMigration
    {
        public override void Up()
        {
            DropForeignKey("dbo.Services", "Category_CategoryID", "dbo.Categories");
            DropIndex("dbo.Services", new[] { "Category_CategoryID" });
            RenameColumn(table: "dbo.Services", name: "Subcategory_SubcategoryID", newName: "SubcategoryID");
            RenameIndex(table: "dbo.Services", name: "IX_Subcategory_SubcategoryID", newName: "IX_SubcategoryID");
            AddColumn("dbo.Subcategories", "CategoryID", c => c.Int(nullable: false));
            CreateIndex("dbo.Subcategories", "CategoryID");
            AddForeignKey("dbo.Subcategories", "CategoryID", "dbo.Categories", "CategoryID", cascadeDelete: true);
            DropColumn("dbo.Services", "Category_CategoryID");
        }



public override void Down()
    {
        AddColumn("dbo.Services", "Category_CategoryID", c => c.Int(nullable: false));
        DropForeignKey("dbo.Subcategories", "CategoryID", "dbo.Categories");
        DropIndex("dbo.Subcategories", new[] { "CategoryID" });
        DropColumn("dbo.Subcategories", "CategoryID");
        RenameIndex(table: "dbo.Services", name: "IX_SubcategoryID", newName: "IX_Subcategory_SubcategoryID");
        RenameColumn(table: "dbo.Services", name: "SubcategoryID", newName: "Subcategory_SubcategoryID");
        CreateIndex("dbo.Services", "Category_CategoryID");
        AddForeignKey("dbo.Services", "Category_CategoryID", "dbo.Categories", "CategoryID", cascadeDelete: true);
    }
}

最后,在我的配置文件中,我添加了以下代码行:

var categories = new List<Category>
            {
                new Category { CategoryName = "Sport" },
                new Category { CategoryName = "Music" }
            };

            categories.ForEach(c => context.Categories.AddOrUpdate(p => p.CategoryName, c));
            context.SaveChanges();

最后,我运行Update-Database命令来更新我的数据库,并使用此名称创建一个新表。但不幸的是,我收到错误消息RenameIndexOperation,并且它没有更新数据库。有人能告诉我如何解决这个问题,并成功更新我的数据库?还请注意,我曾经创建了大量的迁移并进行了大量的数据库更新,然后我确实从项目中删除了我的迁移。这些可能会导致问题。我不知道是否有任何命令可以重置我上次的迁移。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。

我尝试编写drop / create索引,但这要求包含数据类型,我不确定如何做到这一点。 (还没看好)

要回答您的上一个问题,您可以&#34;重置&#34;通过删除您尝试更新的数据库的_migrationhistory表中的记录来进行迁移。

迁移开始时,它会检查该表以了解上次迁移的内容。因此,如果它为空,它将作为初始迁移运行您当前的迁移。

答案 1 :(得分:1)

找到后:How do I rename an Index in MySQL 用于在各种mysql版本中重命名索引。

然后发现你可以用你自己的sql改变迁移:

using System;
using System.Data.Entity.Migrations;

public partial class createdbyemployeerename : DbMigration
{
    public override void Up()
    {
       Sql(@"SET FOREIGN_KEY_CHECKS = 0;
             ALTER TABLE tbl DROP INDEX index_name;
             ALTER TABLE tbl ADD INDEX new_index_name (indexed_column);");
    }
}
希望有所帮助。

MySql服务器版本是5.6所以我必须像上面那样做。 5.7有一个重命名功能,这可能就是你让我遇到这个问题的原因。