首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建索引时,带有mysql数据库迁移的实体框架失败

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

Stack Overflow用户
提问于 2018-04-26 16:28:38
回答 3查看 2K关注 0票数 4

在实体框架的MySQL中,是什么导致了这个错误?我可以生成迁移脚本并连接到数据库,但它不喜欢在尝试创建索引时生成的SQL“散列”。

示例:

代码语言:javascript
运行
复制
CREATE index  `IX_Facility_ID` on `Contact.Address` (`Facility_ID` DESC) using HASH

错误:

MySql.Data.MySqlClient.MySqlException (0x80004005):空间/全文/散列索引和显式索引顺序的错误使用

有办法绕过这件事吗?这是与EF 6和最新的mysql dll。

EN

回答 3

Stack Overflow用户

发布于 2018-08-08 21:50:28

我也遇到了同样的问题,在文章中看到之后,我决定创建一个继承ofMySqlMigrationSqlGenerator的类,并覆盖保护覆盖MigrationStatement Generate ( CreateIndexOperation op ),然后在迁移配置上添加:SetSqlGenerator ( "MySql.Data.MySqlClient",新myMigrationSQLGenerator () );

这是类的代码:

代码语言:javascript
运行
复制
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上的代码

代码语言:javascript
运行
复制
    public Configuration ()
    {           
        AutomaticMigrationsEnabled = false;
        SetSqlGenerator ( "MySql.Data.MySqlClient", new myMigrationSQLGenerator ( ) );
    }

这对我来说很管用。

票数 7
EN

Stack Overflow用户

发布于 2018-04-30 14:47:32

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

代码语言:javascript
运行
复制
.Index(t => t.GroupId, anonymousArguments: new { Type = "BTrees" });

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

票数 2
EN

Stack Overflow用户

发布于 2019-02-15 10:57:24

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

只需在调用之前更改区域性信息,并在以后需要时恢复。

以下是重新加工的版本:

代码语言:javascript
运行
复制
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方法调用之前指定线程区域设置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50047931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档