我正在使用带有实体框架的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)
答案 0 :(得分:0)
此错误是由于MySqlMigrationSqlGenerator.Generate(CreateIndexOperation op)导致的,它通过将字符串转换为double来检查数据库的版本。但是,它无需指定IFormatProvider就可以这样做。由于瑞典语使用“,”作为小数点分隔符,因此此转换失败(版本号由“。”分隔)。
通过重写MySqlMigrationSqlGenerator.Generate(CreateIndexOperation op),可以避免这种情况。使用此答案https://stackoverflow.com/a/51756143/1037864中的代码(这是另一个问题的答案)