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

时间:2018-09-25 13:43:58

标签: mysql .net entity-framework

我正在使用带有实体框架的MySql.Data.Entity版本6.10.8。 我正在执行“代码优先”以让MySql提供程序创建数据库结构。 每当迁移包含创建索引时,运行update-database命令时,迁移都会失败。错误消息和堆栈跟踪如下:

  

System.FormatException:输入字符串的格式不正确。
  在System.Number.ParseDouble(String value,NumberStyles options,   System.Convert.ToDouble(String value)处的NumberFormatInfo numfmt)
  在   MySql.Data.Entity.MySqlMigrationSqlGenerator.Generate(CreateIndexOperation   op)在   MySql.Data.Entity.MySqlMigrationSqlGenerator。<。ctor> b__22_4(MigrationOperation> op)在   MySql.Data.Entity.MySqlMigrationSqlGenerator.Generate(IEnumerable 1   migrationOperations,字符串providerManifestToken)位于   System.Data.Entity.Migrations.DbMigrator.GenerateStatements(IList 1   操作,在System.Data.Entity.Migrations.Infrastructure.MigratorBase.GenerateStatements(IList`1操作,字符串migrationId)在System.Data.Entity.Migrations.Infrastructure.MigratorBase.GenerateStatements   System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String   migrationId,VersionedModel targetModel,IEnumerable 1操作,   IEnumerable 1 systemOperations,布尔降级,布尔自动)
  在System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration   迁移,DbMigration lastMigration)   System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration   迁移,DbMigration lastMigration)   System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable 1   endingMigrations,字符串targetMigrationId,字符串lastMigrationId)
  在   System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable 1   endingMigrations,字符串targetMigrationId,字符串lastMigrationId)
  在System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String   targetMigration)   System.Data.Entity.Migrations.DbMigrator。<> c__DisplayClasse.b__d()   在   System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(动作   mustSucceedToKeepDatabase)   System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(操作   mustSucceedToKeepDatabase)   System.Data.Entity.Migrations.DbMigrator.Update(字符串   targetMigration)   System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String   targetMigration)   System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore()   在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 个答案:

答案 0 :(得分:0)

此错误是由于MySqlMigrationSqlGenerator.Generate(CreateIndexOperation op)导致的,它通过将字符串转换为double来检查数据库的版本。但是,它无需指定IFormatProvider就可以这样做。由于瑞典语使用“,”作为小数点分隔符,因此此转换失败(版本号由“。”分隔)。

通过重写MySqlMigrationSqlGenerator.Generate(CreateIndexOperation op),可以避免这种情况。使用此答案https://stackoverflow.com/a/51756143/1037864中的代码(这是另一个问题的答案)