在 MySQL 数据库上运行迁移时出现实体框架错误。 “空间/全文/哈希索引和显式索引顺序的错误使用”

Posted

技术标签:

【中文标题】在 MySQL 数据库上运行迁移时出现实体框架错误。 “空间/全文/哈希索引和显式索引顺序的错误使用”【英文标题】:Getting an Entity Framework error running migrations on a MySQL database. "Incorrect usage of spatial/fulltext/hash index and explicit index order" 【发布时间】: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 数据库更新,然后再试一次。

【问题讨论】:

这可能会有所帮助:***.com/questions/49945561/… 8.0 开始在索引声明中尊重DESC 【参考方案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】:

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

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

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

【讨论】:

【参考方案3】:

看到这个answer

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

【讨论】:

以上是关于在 MySQL 数据库上运行迁移时出现实体框架错误。 “空间/全文/哈希索引和显式索引顺序的错误使用”的主要内容,如果未能解决你的问题,请参考以下文章

无法使用实体框架代码优先创建具有凭据的数据库?

查询 MySql 视图时出现 SQLGrammar 错误

使用 Laravel 迁移创建外键时出现 MySQL 错误

使用 Workbench 将 MS Access 迁移到 MySQL 时出现日期时间错误

MySQL & MsAccess 2007 - 尝试更新时出现错误 3197

恢复 Django-mailer 数据库时出现 MySQL 错误 1118(行大小太大)