在MySQL中使用实体框架导致此错误的原因是什么?我可以生成迁移脚本并连接到数据库,但它不喜欢特别生成的SQL" hash"在尝试创建索引时。
示例:
CREATE index `IX_Facility_ID` on `Contact.Address` (`Facility_ID` DESC) using HASH
错误:
MySql.Data.MySqlClient.MySqlException(0x80004005):空间/全文/哈希索引和显式索引顺序的使用不正确
这有什么办法吗?这是EF 6和最新的mysql dll。
答案 0 :(得分:4)
我遇到了同样的问题,在阅读文章后,我决定创建一个继承自MySqlMigrationSqlGenerator的类并覆盖 受保护的覆盖MigrationStatement Generate(CreateIndexOperation op) ,然后进行配置我添加的迁移对象: 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;
}
}
这是 Migrations \ Configuration.cs 上的代码:
public Configuration ()
{
AutomaticMigrationsEnabled = false;
SetSqlGenerator ( "MySql.Data.MySqlClient", new myMigrationSQLGenerator ( ) );
}
这对我有用。
答案 1 :(得分:2)
查看MySql源代码,您需要在索引定义上添加( anonymousArguments:new {Type =“BTrees”} ):
.Index(t => t.GroupId, anonymousArguments: new { Type = "BTrees" });
这不是修复,但目前您可以应用迁移代码。
答案 2 :(得分:1)
我认为在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方法调用之前指定线程语言环境