创建索引时,具有mysql数据库迁移的实体框架失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建索引时,具有mysql数据库迁移的实体框架失败相关的知识,希望对你有一定的参考价值。

是什么导致mysql与实体框架的错误?我可以生成迁移脚本并连接到数据库,但它不喜欢在尝试创建索引时生成的SQL特别是“哈希”。

例:

CREATE index  `IX_Facility_ID` on `Contact.Address` (`Facility_ID` DESC) using HASH

错误:

MySql.Data.MySqlClient.MySqlException(0x80004005):空间/全文/哈希索引和显式索引顺序的使用不正确

有没有办法解决?这是EF 6和最新的mysql dll。

答案

我有同样的问题,在我阅读帖子后,我决定创建一个继承MySqlMigrationSqlGenerator的类并覆盖受保护的覆盖MigrationStatement Generate(CreateIndexOperation op),然后在配置迁移时添加:SetSqlGenerator(“MySql.Data.MySqlClient”,new myMigrationSQLGenerator ());

这是类的代码:

public class myMigrationSQLGenerator : MySqlMigrationSqlGenerator
{
    private string TrimSchemaPrefix ( string table )
    {
        if ( table.StartsWith ( "dbo." ) )
            return table.Replace ( "dbo.", "" );
        return table;
    }

    protected override MigrationStatement Generate ( CreateIndexOperation op )
    {
        var u = new MigrationStatement ( );
        string unique = ( op.IsUnique ? "UNIQUE" : "" ), columns = "";
        foreach ( var col in op.Columns )
        {
            columns += ( $"`{col}` DESC{( op.Columns.IndexOf ( col ) < op.Columns.Count - 1 ? ", " : "" )}" );
        }
        u.Sql = $"CREATE {unique} INDEX `{op.Name}` ON `{TrimSchemaPrefix ( op.Table )}` ({columns}) USING BTREE";
        return u;
    }
}

这是Migrations Configuration.cs上的代码:

    public Configuration ()
    {           
        AutomaticMigrationsEnabled = false;
        SetSqlGenerator ( "MySql.Data.MySqlClient", new myMigrationSQLGenerator ( ) );
    }

这项工作对我来说。

另一答案

查看MySql源代码,需要在索引定义中添加(anonymousArguments:new {Type =“BTrees”}):

.Index(t => t.GroupId, anonymousArguments: new { Type = "BTrees" });

这不是一个修复,但目前您可以应用迁移代码。

另一答案

我认为先前DEFAULT生成方法的线程区域设置更改比henoc salinas更好。标准实现中可能存在另一个隐藏的缺陷,并且每次更新MySql包时都需要支持此缺陷。

只需在事先呼叫时更改文化信息,然后在需要时恢复。

这是重写版本:

public class CustomizedMySqlMigrationSqlGenerator : MySqlMigrationSqlGenerator
{
    #region Override members

    protected override MigrationStatement Generate(CreateIndexOperation op)
    {
        var currentCulture = Thread.CurrentThread.CurrentCulture;
        try
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en");
            return base.Generate(op);
        }
        finally
        {
            Thread.CurrentThread.CurrentCulture = currentCulture;
        }
    }

    ...
    //Same for all overriden Generate() methods

    #endregion
}

如果不关心语言环境持久性(代码优先模型),也可以在调用SetSqlGenerator方法之前指定线程语言环境

以上是关于创建索引时,具有mysql数据库迁移的实体框架失败的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 实体框架:无法创建索引

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

实体框架代码优先:迁移失败并更新数据库,强制不必要的(?)添加迁移

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

实体框架:添加迁移失败,无法更新数据库

实体框架6代码首先用oracle更新实体