我收到错误 - 操作失败,因为表'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());
}
}
如果你删除了索引然后超过了设置为运行的代码,如果有任何数据库迁移,那么一切运行良好(没有错误),但是如果删除整个数据库(当然在开发环境中)和重新创建空数据库,然后您将再次看到此错误。为什么这个错误甚至首先发生?
答案 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");
。
希望它适合你。