【问题标题】:Upgrade Entity Framework to 6.1 - index already exists errors将实体框架升级到 6.1 - 索引已存在错误
【发布时间】:2014-03-19 02:45:08
【问题描述】:

我刚刚将使用代码优先模型的项目从 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的流程吗?

【问题讨论】:

  • 您自己创建过索引吗?
  • 不,所有现有索引都是由 EF 迁移创建的。
  • 这里的场景完全相同。确实是一个错误-(

标签: c# entity-framework


【解决方案1】:

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

【讨论】:

  • +1:这将创建一个空的虚拟任务,该任务只会将模型架构的哈希写入 EF6.1 看到的迁移历史记录。
【解决方案2】:

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

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

【讨论】:

  • 那么这听起来像是 EF 6.1 中的一个错误。你举报了吗?
【解决方案3】:

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>();
}

【讨论】:

  • 谢谢!这解决了我的问题。我们一直在迭代系统并创建自己的索引,因为 EF 的功能有限。我们使用了 nuget 并更新了所有软件包。一旦我们这样做了,由于新的 ef,我们的迁移计划失败了。上面的这个选项,让一切恢复正常! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多