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

368yc8dk  于 2021-06-23  发布在  Mysql
关注(0)|答案(3)|浏览(520)

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

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

错误:
mysql.data.mysqlclient.mysqlexception(0x80004005):空间/全文/哈希索引和显式索引顺序的用法不正确
有什么办法吗?这是EF6和最新的mysql DLL。

zaqlnxep

zaqlnxep1#

查看mysql源代码,您需要在索引定义中添加以下内容(匿名参数:new{type=“btrees”}):

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

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

g2ieeal7

g2ieeal72#

我也遇到了同样的问题,在阅读了文章之后,我决定创建一个类继承mysqlmigrationsqlgenerator并覆盖protected override migrationstatement generate(createindexoperation op),然后在迁移的配置上添加:setsqlgenerator(“mysql.data.mysqlclient”,new mymigrationsqlgenerator());
这是类的代码:

  1. public class myMigrationSQLGenerator : MySqlMigrationSqlGenerator
  2. {
  3. private string TrimSchemaPrefix ( string table )
  4. {
  5. if ( table.StartsWith ( "dbo." ) )
  6. return table.Replace ( "dbo.", "" );
  7. return table;
  8. }
  9. protected override MigrationStatement Generate ( CreateIndexOperation op )
  10. {
  11. var u = new MigrationStatement ( );
  12. string unique = ( op.IsUnique ? "UNIQUE" : "" ), columns = "";
  13. foreach ( var col in op.Columns )
  14. {
  15. columns += ( $"`{col}` DESC{( op.Columns.IndexOf ( col ) < op.Columns.Count - 1 ? ", " : "" )}" );
  16. }
  17. u.Sql = $"CREATE {unique} INDEX `{op.Name}` ON `{TrimSchemaPrefix ( op.Table )}` ({columns}) USING BTREE";
  18. return u;
  19. }
  20. }

这是migrations\configuration.cs上的代码:

  1. public Configuration ()
  2. {
  3. AutomaticMigrationsEnabled = false;
  4. SetSqlGenerator ( "MySql.Data.MySqlClient", new myMigrationSQLGenerator ( ) );
  5. }

这是我的工作。

展开查看全部
r6l8ljro

r6l8ljro3#

我认为线程区域设置更改优先于默认生成方法是比henoc salinas更好的解决方案。在标准实现中可能存在另一个隐藏的缺陷,而且每次更新mysql包时都需要支持这一点。
只需在调用之前更改区域性信息,然后在需要时恢复。
这是修改后的版本:

  1. public class CustomizedMySqlMigrationSqlGenerator : MySqlMigrationSqlGenerator
  2. {
  3. #region Override members
  4. protected override MigrationStatement Generate(CreateIndexOperation op)
  5. {
  6. var currentCulture = Thread.CurrentThread.CurrentCulture;
  7. try
  8. {
  9. Thread.CurrentThread.CurrentCulture = new CultureInfo("en");
  10. return base.Generate(op);
  11. }
  12. finally
  13. {
  14. Thread.CurrentThread.CurrentCulture = currentCulture;
  15. }
  16. }
  17. ...
  18. //Same for all overriden Generate() methods
  19. #endregion
  20. }

另外,如果不关心区域设置持久性(代码优先模型),则可以在setsqlgenerator方法调用之前指定线程区域设置

展开查看全部

相关问题