【问题标题】:EF6 - Incorrect usage of spatial/fulltext/hash index and explicit index orderEF6 - 空间/全文/哈希索引和显式索引顺序的错误使用
【发布时间】:2018-12-10 22:48:36
【问题描述】:

我正在尝试与 EF6 建立一对多关系

这是我的实体。

书:

public class Book
{
    public int BookId { get; set; }
    public string BookName { get; set; }
}

出版商:

public class Publisher
{
    public int PublisherId { get; set; }
    public string PublisherName { get; set; }
    public ICollection<Book> Books { get; set; }
}

上下文:

[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MyContext : DbContext
{
    public MyContext() : base("name=MySqlDbConnectionString")
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>());
    }

    public DbSet<Publisher> Publishers { get; set; }
    public DbSet<Book> Books { get; set; }
}

程序:

static void Main(string[] args)
    {
        using (MyContext entities = new MyContext())
        {
            Book user = new Book() { BookName = "gdsag" };
            entities.Books.Add(user);
            entities.SaveChanges();
        }
    }

问题是用于自动创建数据库。 但是当我运行它时,我收到以下错误:

MySql.Data.MySqlClient.MySqlException: '空间/全文/散列索引和显式索引顺序的使用不正确'

我使用的是 EF 6.2
MySql.Data 6.9
MySql.Data.Entity 6.9

任何想法我在做什么错误?

提前致谢

编辑: 这些是生成 sql 命令

create table `Books` (`BookId` int not null  auto_increment ,`BookName` longtext,`Publisher_PublisherId` int,primary key ( `BookId`) ) engine=InnoDb auto_increment=0
-- Executing at 7/2/2018 11:02:32 PM +03:00
-- Completed in 52 ms with result: 0

create table `Publishers` (`PublisherId` int not null  auto_increment ,`PublisherName` longtext,primary key ( `PublisherId`) ) engine=InnoDb auto_increment=0
-- Executing at 7/2/2018 11:02:32 PM +03:00
-- Completed in 49 ms with result: 0

CREATE index  `IX_Publisher_PublisherId` on `Books` (`Publisher_PublisherId` DESC) using HASH
-- Executing at 7/2/2018 11:02:32 PM +03:00
-- Failed in 2 ms with error: Incorrect usage of spatial/fulltext/hash index and explicit index order

Disposed transaction at 7/2/2018 11:02:32 PM +03:00

【问题讨论】:

  • 能否查看生成的命令(update-database -verbose),看看booksID或publisher的id上是否指定了顺序?

标签: c# mysql entity-framework


【解决方案1】:

当然,我所做的是从 MySqlMigrationSqlGenerator 继承一个类,然后在我的 DbMigrationsConfiguration 处理程序中激活该类。首先列出了该类,还提供了迁移处理程序的摘录

public class FixedMySqlMigrationSqlGenerator : MySqlMigrationSqlGenerator
{
    public FixedMySqlMigrationSqlGenerator()
        :base()
    {
    }

    /// <summary>
    /// we want BTREE because HASH is not correct for normal Keys on MySQL 8
    /// </summary>
    /// <param name="op"></param>
    /// <returns></returns>
    protected override MigrationStatement Generate(CreateIndexOperation op)
    {
        MigrationStatement migrationStatement = base.Generate(op);
        System.Diagnostics.Trace.WriteLine(migrationStatement.Sql);
        string fubarSql = migrationStatement.Sql.TrimEnd();

        if(fubarSql.EndsWith("using HASH",StringComparison.OrdinalIgnoreCase))
        {
            string modSql = fubarSql.Replace("using HASH", " using BTREE");
            migrationStatement.Sql = modSql;
        }
        return migrationStatement;
    }


}

我也有一个 dbmigrations 配置类

public sealed class LogDataMigration : DbMigrationsConfiguration<LogDataContext>
{
    public const string CONTEXT_KEY = "BalsamicSoftware.LogData";
    private static readonly HashSet<string> _InitializedConnections = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

    private static readonly object _LockProxy = new object();

    public LogDataMigration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
        ContextKey = CONTEXT_KEY;
        SetSqlGenerator("MySql.Data.MySqlClient", new FixedMySqlMigrationSqlGenerator());

    }
}

迁移配置类通过静态调用激活

Database.SetInitializer<LogDataContext>(new MigrateDatabaseToLatestVersion<LogDataContext, LogDataMigration>(true));

所以它的三个步骤,首先创建一个迁移配置(如果您还没有)。实现 sql 生成器,然后从迁移配置中调用 sql 生成器。

【讨论】:

    【解决方案2】:

    我最近更新到 .NET 的 8.X my sql 客户端库。我正在构建一个框架应用程序(不是 CORE),并且我主要使用 EF 实体的数据注释(不是流利的)配置,我遇到了同样的问题。数据上下文不会初始化并会生成错误“空间/全文/哈希索引和显式索引顺序的使用不正确”。事实证明,MySQL 开发人员似乎忽略了这个场景测试套件。我最终覆盖了 MySqlMigrationSqlGenerator 中的 CreateIndexOperation 生成器,并将默认的“使用 HASH”替换为“使用 BTREE”。现在我的索引是正确创建的外键关系。

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 1970-01-01
      • 2018-10-01
      • 2023-03-29
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多