我得到错误-操作失败,因为索引或统计名称'IX_address_unique'已经存在于表'dbo.Addresses'上。所讨论的索引是一个复合索引,我使用代码首先创建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());
}
}
如果你删除索引,然后运行代码,如果有任何数据库迁移,那么一切工作正常(没有错误),但如果你删除整个数据库(当然是在开发环境中),并重新创建空数据库,那么你将再次看到这个错误。为什么会发生这种错误呢?
我面对同样的问题与代码优先的方法与mysql数据库工作。如果您正在使用mysql数据库,请尝试从代码中删除dbo
前缀。向上写CreateIndex("Addresses", new[] { "address1", "city", "state", "postal_code" }, unique: true, name: "IX_address_unique");
。写下DropIndex("Addresses", "IX_address_unique");
。