代码之家  ›  专栏  ›  技术社区  ›  Björn

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

  •  1
  • Björn  · 技术社区  · 7 年前

    我正在使用MySql.Data.Entity版本6.10.8和Entity Framework。 我正在做“代码优先”让MySql提供者创建数据库结构。 每当迁移包含索引的创建时,运行update database命令时,我的迁移就会失败。错误消息和堆栈跟踪如下:

    System.FormatException:输入字符串的格式不正确。
    在System.Number.ParseDouble(字符串值,NumberStyles选项, NumberFormatInfo numfmt)在System.Convert.ToDouble(字符串值)
    在 MySql.Data.Entity.MySqlMigrationSqlGenerator.Generate(CreateIndexOperation) MySql.Data.Entity.MySqlMigrationSqlGenerator.Generate(IEnumerable 1) 迁移操作,字符串providerManifestToken)位于 System.Data.Entity.Migrations.DbMigrator.GenerateStatements(IList 1) System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(字符串 IEnumerable 1(系统操作、布尔降级、布尔自动)
    位于System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration 迁移,DbMigration lastmigation)在 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(数据库迁移 迁移,DbMigration lastmigation)在 System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable 1) pendingMigrations,String targetMigrationId,String lastMigrationId)
    在 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable 1) pendingMigrations,String targetMigrationId,String lastMigrationId)
    targetMigration)在 System.Data.Entity.Migrations.DbMigrator.<&燃气轮机;c\u显示类.b\u d() 在 System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(操作 必须在上成功获取(数据库) System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(操作 必须在上成功获取(数据库) targetMigration)在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串 targetMigration)在 System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore() 输入字符串的格式不正确。

    如何重复:

    创建带有索引的迁移文件,例如:

    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
    

    https://bugs.mysql.com/bug.php?id=92561 )

    1 回复  |  直到 7 年前
        1
  •  4
  •   Björn    7 年前

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

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