将实体框架升级到6.1 - 索引已存在错误

时间:2014-03-19 02:45:09

标签: c# entity-framework

我刚刚使用代码优先模型从Entity Framework 6.0.2升级到6.1.0。

升级后,context.Database.CompatibleWithModel(true)返回false,因此EF认为数据库不再与模型兼容。我没有改变任何其他东西,只是升级了EF。

我运行Add-Migration以查看会发生什么,并且EF创建了一个大型迁移,似乎在每个表上的每个外键属性上创建索引:

    public override void Up()
    {
        CreateIndex("dbo.ActivityStreams", "UserId");
        CreateIndex("dbo.Users", "OfficeId");
        CreateIndex("dbo.Offices", "ParentId");
        CreateIndex("dbo.Rosters", "UserId");
        ...and many more similar lines...

我想这与EF 6.1中的新索引功能有关?有点奇怪,但还行。

当我Update-Database应用新迁移时,存在索引已存在的错误。查看数据库和以前的迁移,几乎所有索引确实已经存在。

我在这里做错了什么?是否有升级EF的程序?

3 个答案:

答案 0 :(得分:11)

正如其他答案所述,这是由于实体框架错误造成的。将DropIndex代码复制到Up方法的已接受答案会导致对数据库进行不必要的工作。相反,我建议正确的做法是删除UpDown方法的内容,因为这些索引已经存在且不需要删除。

答案 1 :(得分:8)

我有完全相同的问题。我通过重新创建索引来修复它。

我通过在迁移到Up方法时从Down方法粘贴DropIndexes来完成此操作。 因此,首先有效地删除索引,然后重新创建它们。 不知道为什么这是必要的,但它解决了这个问题。

答案 2 :(得分:1)

Re:您的外键正在创建,我在以下链接中找到了以下信息:

http://blog.oneunicorn.com/2014/02/15/ef-6-1-creating-indexes-with-indexattribute/声明如下:

ForeignKeyIndexConvention Code First约定导致为模型中任何外键的列创建索引,除非这些列已经使用IndexAttribute指定了索引。如果您不想要FK的索引,可以删除此约定:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<ForeignKeyIndexConvention>();
}