使用EF Core创建MySQL数据库



我正在使用 AspNetCore.Identity.EntityFrameworkCore(1.1.1(和 SapientGuardian(7.1.23(生成代码第一个数据库,因为我有一个mySQL数据库(mariaiaDB(。使用Updata-Database命令或context.Database.EnsureCreated();时,抛出以下异常:

Index column size too large. The maximum column size is 767 bytes.

我检查了一些日志,发现所有表都是创建的。但是,在执行Create Index [...]查询问题时,问题发生了。以下查询是抛出异常之前的最后一个:

CREATE INDEX EmailIndex ON AspNetUsers (NormalizedEmail);

EmailNormalizedEmail列的类型是varchar(255)

该问题的原因是什么?我该如何解决?

编辑:

SELECT character_set_name, column_type FROM information_schema.`COLUMNS` 
WHERE table_schema = "schema"
  AND table_name = "AspNetUsers"
  AND (column_name = "Email" OR COLUMN_NAME="NormalizedEmail");

交付:

|---------------------|------------------|
| character_set_name  |   column_type    |
|---------------------|------------------|
|          utf8       |   varchar(256)   |
|---------------------|------------------|
|          utf8       |   varchar(256)   |
|---------------------|------------------|

edit2:手动调整EF核心生成的迁移解决此问题。我将所有索引的最大长度属性从256更改为255。但是有没有办法配置实体框架核心来调整迁移?

只是为了总结评论中讨论的内容:

错误消息与以下事实有关:在MySQL的InnoDB表中,单场索引长度的限制在大多数情况下为767字节。NormalizedEmail字段具有VARCHAR(256(的类型和UTF8的字符集。在MySQL UTF8字符中最多可以长3个字节,因此在这种情况下,索引字节长度为256 * 3 2 = 770字节,该字节比最大限制更长。

有2种可能的解决方案:

  1. create index语句中手动提供索引长度前缀为255。缺点是不是整个字段索引。

    CREATE INDEX EmailIndex ON AspNetUsers (NormalizedEmail(255));
    
  2. 使用最大长度限制将NormalizedEmail字段的长度限制为255。

相关内容

  • 没有找到相关文章

最新更新