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

时间:2018-05-25 08:41:46

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

问题

对新安装的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);

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

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无法正常工作。

所以在这个阶段它连接得很好但似乎数据库本身不喜欢Entity Framework正在生成的索引命令。

我很乐意在必要时提供更多信息。

版本

  • MySql.Data 6.10.7
  • MySql.Data.Entity 6.10.7
  • EntityFramework 6.2.0
  • MySql Database 8.0.11社区

更新

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

然而,即使在成功运行迁移之后,MySql.Data(.Entity)也不断发出运行时错误。

将数据库恢复为MySql 5的上一个主要版本时,代码可以完美运行而无需更改。

我等待一段时间让NuGet包和MySql数据库更新,然后再给它一个。

3 个答案:

答案 0 :(得分:0)

这太容易了。我搜索了错误消息并提出了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)");

我希望实体框架正在监听并修复代码。

答案 1 :(得分:0)

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

  1. 我认为你需要重新考虑Who_ID上的FK作为一个字符串 对于糟糕的FK。请查看建议的解决方案StackExchange
  2. 当我有复杂的数据库时,我经常会遇到问题而我会尝试 和流畅的API脚本。我经常把这个分开 分为步骤,第一个表,然后是索引,然后是关系。
  3. 这是否可以解决您的问题,也许您可​​以发布一些DDL,以便我们更好地协助您解决问题?

答案 2 :(得分:0)

查看此answer

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