Платформа сущностей с миграциями базы данных mysql терпит неудачу, при создании индексов - PullRequest
0 голосов
/ 26 апреля 2018

что вызывает эту ошибку в MySQL с Entity Framework? Я могу сгенерировать сценарий миграции и подключиться к базе данных, но ему не нравится генерируемый SQL, особенно «хэш» при попытке создания индексов.

Пример:

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

Ошибка:

MySql.Data.MySqlClient.MySqlException (0x80004005): неправильное использование пространственного / полнотекстового / хеш-индекса и явного порядка индекса

Есть ли способ обойти это? Это с EF 6 и последними DLL-файлами mysql.

Ответы [ 3 ]

0 голосов
/ 09 августа 2018

У меня возникла та же проблема, после того, как я прочитал сообщения, я решил создать класс, наследующий MySqlMigrationSqlGenerator и переопределить я добавляю: SetSqlGenerator («MySql.Data.MySqlClient», новый 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;
    }
}

и это код на Миграции \ Configuration.cs :

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

эта работа для меня.

0 голосов
/ 15 февраля 2019

Я думаю, что изменение локали потока перед методами генерации ПО УМОЛЧАНИЮ является лучшим решением, чем 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, если вам не важно постоянство языкового стандарта (сначала модель кода)

0 голосов
/ 30 апреля 2018

Глядя на исходный код MySql, вам нужно добавить это ( anonymousArguments: new {Type = "BTrees"} ) в определения индекса:

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

Это не исправление, но на данный момент вы можете применить код миграции.

...