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

4
我正在使用MySql.Data.Entity 6.10.8版本和Entity Framework。我正在使用“Code First”让MySql提供程序创建数据库结构。每当迁移包含索引的创建时,我的迁移在运行update-database命令时失败。以下是错误消息和堆栈跟踪:
System.FormatException:输入字符串格式不正确。
at System.Number.ParseDouble(String value,NumberStyles options, NumberFormatInfo numfmt) at System.Convert.ToDouble(String value)
at MySql.Data.Entity.MySqlMigrationSqlGenerator.Generate(CreateIndexOperation op) at MySql.Data.Entity.MySqlMigrationSqlGenerator.<.ctor>b__22_4(MigrationOperation> op) at MySql.Data.Entity.MySqlMigrationSqlGenerator.Generate(IEnumerable 1 migrationOperations, String providerManifestToken) at System.Data.Entity.Migrations.DbMigrator.GenerateStatements(IList 1 operations, String migrationId) at System.Data.Entity.Migrations.Infrastructure.MigratorBase.GenerateStatements(IList`1 operations, String migrationId) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable 1 operations, IEnumerable 1 systemOperations, Boolean downgrading, Boolean auto)
at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration) at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable 1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable 1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration) at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClasse.b__d() at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore() at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
如何重复:
使用瑞典Windows(或任何其他不使用“。”作为小数分隔符的语言)。
创建一个包含索引的迁移文件,例如:
CreateTable(
"dbo.AspNetRoles",
c => new
{
  Id = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
  Name = c.String(nullable: false, maxLength: 256, storeType: "nvarchar"),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, unique: true, name: "RoleNameIndex"); // This line causes the exception

运行数据库更新

(已向MySQL发送错误报告:https://bugs.mysql.com/bug.php?id=92561

1个回答

4

这个错误是由MySqlMigrationSqlGenerator.Generate(CreateIndexOperation op)引起的,该操作通过将字符串转换为double来检查数据库的版本。然而,它没有指定IFormatProvider。由于瑞典使用","作为小数分隔符,因此此转换失败(版本号由"."分隔)。

通过覆盖MySqlMigrationSqlGenerator.Generate(CreateIndexOperation op)可以避免这种情况。使用这个答案中的代码https://dev59.com/H6rka4cB1Zd3GeqPle9J#51756143(这是针对不同问题的答案)


1
你是正确的,但更好的答案应该是BlackGad在你引用的答案中的评论https://dev59.com/H6rka4cB1Zd3GeqPle9J#54707831。 - Nicolas C
谢谢@NicolasC,这似乎是一个不错的解决方案。由于我自己还没有尝试过,所以现在不会更改我的答案。此外,根据我的错误票答案,这应该在8.0.19版本中可以直接使用。 - Björn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接