【问题标题】:Getting an Entity Framework error running migrations on a MySQL database. "Incorrect usage of spatial/fulltext/hash index and explicit index order"在 MySQL 数据库上运行迁移时出现实体框架错误。 “空间/全文/哈希索引和显式索引顺序的错误使用”
【发布时间】:2018-11-04 14:33:30
【问题描述】:

问题

在对新安装的 MySQL 数据库(对 SQL Server 数据库运行良好)运行迁移时,它在第一次创建表时失败并出现错误:

空间/全文/哈希索引和显式索引顺序的错误使用

当它尝试运行以下Index 方法时会发生这种情况:

CreateTable(
    "dbo.AuditLog",
    c => new
    {
        Id = c.Int(nullable: false, identity: true),
        Name = c.String(maxLength: 1000, unicode: false),
        What = c.String(maxLength: 1000, unicode: false),
        When = c.DateTime(nullable: false, precision: 6),
        Why = c.String(maxLength: 1000, unicode: false),
        Where = c.Int(nullable: false),
        Who_Id = c.String(maxLength: 128, unicode: false),
    })
    .PrimaryKey(t => t.Id)
    .ForeignKey("dbo.AspNetUsers", t => t.Who_Id);
    .Index(t => t.Who_Id);

Update-Database 上使用-verbose 标志后,我看到导致此错误的命令如下。

CREATE index  `IX_Who_Id` on `AuditLog` (`Who_Id` DESC) using HASH

在线搜索对于解决这个问题并不是很有用。我见过的最接近的是this Stack Overflow question,但它对我不起作用。


背景

针对旧的(大约 3 年前)MySQL 数据库运行迁移工作正常,但是当我安装新的 MySQL 时,我收到有关密码身份验证的错误,这将通过更新 MySQL NuGet 包或强制执行该用户来解决使用旧密码。有关此问题,请参阅 here

我将我的 MySQL NuGet 包更新到了​​最新版本,这导致了一个不同的错误(可以看到 here),我通过降级到比我开始使用的包更新的包解决了这个问题,但低于人们所使用的最新包提到 API 无法正常工作。

所以在这个阶段它连接良好,但似乎数据库本身不喜欢实体框架生成的索引命令。

如有必要,我很乐意提供更多信息。

版本

  • MySql.Data 6.10.7
  • MySql.Data.Entity 6.10.7
  • EntityFramework 6.2.0
  • MySql 数据库 8.0.11 社区

更新

我通过手动执行 SQL 命令并在针对 MySql 实例时替换 .Index() 调用,设法让它在 MySql 上运行。

然而,即使在显然成功运行迁移之后,MySql.Data(.Entity) 仍然会出现运行时错误。

将数据库恢复到以前的 MySql 5 主要版本时,代码可以完美运行,无需任何更改。

我会等待一段时间,让 NuGet 包和 MySql 数据库更新,然后再试一次。

【问题讨论】:

标签: c# mysql entity-framework entity-framework-6 mysql-8.0


【解决方案1】:

这太容易了。我搜索了错误消息并想出了EF: Incorrect usage of spatial/fulltext/hash index and explicit index order 解释了消除该错误的两个步骤——删除

.Index(t => t.Who_Id)

并添加

Sql("CREATE index `IX_Who_Id` on `AuditLog` (`Who_Id` DESC)");

我希望 Entity Framework 正在监听并修复代码。

【讨论】:

  • 嗨瑞克,感谢您的回答。正如我在帖子中提到的那样,我知道这个问题,不幸的是它最初并没有为我工作。当使用该方法并删除 DESC 时,它确实允许迁移运行。但是,即使在运行迁移之后,我仍然遇到问题。最后我意识到这一切都只发生在 MySql 8 上,这是一个非常新的主要版本。我会更新我的帖子。
【解决方案2】:

不确定它是否能解决你的问题,但

  1. 我认为您需要重新考虑 Who_ID 上的 FK,因为字符串会使 对于坏的FK。查看StackExchange 提出的解决方案。
  2. 当我有复杂的数据库并尝试时,我通常会遇到问题 并使用流利的 API 编写脚本。我通常把这个分开 进入步骤,首先是表,然后是索引,然后是关系。

这是否解决了您的问题,也许您可​​以发布一些 DDL,以便我们更好地帮助您解决您的问题?

【讨论】:

    【解决方案3】:

    看到这个answer

    在此我创建一个继承类,覆盖一个函数并在 configuration.cs 上设置我的自定义类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-01
      • 2018-10-10
      • 2018-12-10
      • 2023-03-29
      • 2017-07-03
      • 2018-10-07
      • 1970-01-01
      • 2013-05-08
      相关资源
      最近更新 更多