获取索引已存在于表错误实体框架代码首次迁移中

时间:2016-11-17 02:27:03

标签: entity-framework ef-code-first

我收到错误 - 操作失败,因为表'dbo.Addresses'上已存在名为'IX_address_unique'的索引或统计信息。有问题的索引是我用代码第一个EF版本6创建的复合索引。这是DbContext类中的代码 -

// create unique address composite index based on properties // address1 property modelBuilder.Entity<Address>().Property(t => t.address1) .HasMaxLength(250) .IsRequired() .HasUniqueIndexAnnotation("IX_address_unique", 0); // city property modelBuilder.Entity<Address>().Property(t => t.city) .HasMaxLength(50) .IsRequired() .HasUniqueIndexAnnotation("IX_address_unique", 1); // state property modelBuilder.Entity<Address>().Property(t => t.state) .HasMaxLength(50) .IsRequired() .HasUniqueIndexAnnotation("IX_address_unique", 2); // postal code property modelBuilder.Entity<Address>().Property(t => t.postal_code) .HasMaxLength(20) .IsRequired() .HasUniqueIndexAnnotation("IX_address_unique", 3);

当您运行Add-Migration CreateUniqueIndexAddressesTable命令时,这将创建以下DbMigration。

public partial class CreateUniqueIndexAddressesTable : DbMigration
{
    public override void Up()
    {
        AlterColumn("dbo.Addresses", "address1", c => c.String(nullable: false, maxLength: 250));
        AlterColumn("dbo.Addresses", "address2", c => c.String(maxLength: 250));
        AlterColumn("dbo.Addresses", "city", c => c.String(nullable: false, maxLength: 50));
        AlterColumn("dbo.Addresses", "state", c => c.String(nullable: false, maxLength: 50));
        AlterColumn("dbo.Addresses", "postal_code", c => c.String(nullable: false, maxLength: 20));
        CreateIndex("dbo.Addresses", new[] { "address1", "city", "state", "postal_code" }, unique: true, name: "IX_address_unique");
    }

    public override void Down()
    {
        DropIndex("dbo.Addresses", "IX_address_unique");
        AlterColumn("dbo.Addresses", "postal_code", c => c.String());
        AlterColumn("dbo.Addresses", "state", c => c.String());
        AlterColumn("dbo.Addresses", "city", c => c.String());
        AlterColumn("dbo.Addresses", "address2", c => c.String());
        AlterColumn("dbo.Addresses", "address1", c => c.String());
    }
}

如果你删除了索引然后超过了设置为运行的代码,如果有任何数据库迁移,那么一切运行良好(没有错误),但是如果删除整个数据库(当然在开发环境中)和重新创建空数据库,然后您将再次看到此错误。为什么这个错误甚至首先发生?

1 个答案:

答案 0 :(得分:1)

我在使用 mysql 数据库的代码优先方法时遇到了同样的问题。如果您使用的是mysql数据库,请尝试从代码中删除dbo前缀。所以对于Up write CreateIndex("Addresses", new[] { "address1", "city", "state", "postal_code" }, unique: true, name: "IX_address_unique");。对于向下写DropIndex("Addresses", "IX_address_unique");。 希望它适合你。

相关问题