6

问题

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

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

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

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


背景

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

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

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

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

版本

  • MySql.Data 6.10.7
  • MySql.Data.Entity 6.10.7
  • 实体框架 6.2.0
  • MySql 数据库 8.0.11 社区

更新

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

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

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

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

4

3 回答 3

0

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

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

于 2018-05-28T13:28:47.260 回答
0

看到这个答案

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

于 2018-08-09T14:14:49.597 回答
0

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

  1. 我认为您需要重新考虑 Who_ID 上的 FK,因为字符串会导致错误的 FK。查看StackExchange的建议解决方案。
  2. 当我拥有复杂的数据库并尝试使用 fluent API 编写脚本时,我通常会遇到问题。我通常把它分成几个步骤,首先是表,然后是索引,然后是关系。

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

于 2018-06-02T12:43:20.010 回答