首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行更新数据库时MVC5中出现RenameIndexOperation错误

问执行更新数据库时MVC5中出现RenameIndexOperation错误
EN

Stack Overflow用户
提问于 2014-08-12 06:18:57
回答 2查看 2.4K关注 0票数 3

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

代码语言:javascript
复制
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,它创建了以下内容:

代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
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,而且它没有更新数据库。有人能告诉我如何解决这个问题,并成功地更新我的数据库吗?还请注意,我过去常常创建大量的迁移并进行大量的数据库更新,然后我从项目中删除了我的迁移。这些可能是导致问题的原因。我不知道是否有重置上次迁移的命令。

EN

回答 2

Stack Overflow用户

发布于 2014-09-03 05:05:43

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

然后发现您可以使用自己的sql更改迁移,如下所示:

代码语言:javascript
复制
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有一个重命名功能,这可能是你和我有这个问题的原因。

票数 2
EN

Stack Overflow用户

发布于 2014-09-03 04:35:11

我也有同样的问题。

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

要回答您的最后一个问题,您可以通过从要更新的数据库的_migrationhistory表中删除记录来“重置”迁移。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25253341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档