使用 EF Core 创建 MySql 数据库
Creating MySql database with EF Core
我正在使用 AspNetCore.Identity.EntityFrameworkCore
(1.1.1) 和 SapientGuardian
(7.1.23) 生成代码优先数据库,因为我有一个 MySql 数据库 (MariaDB)。使用 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);
Email
和 NormalizedEmail
列的类型是 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 core 生成的迁移解决了这个问题。我将所有索引的最大长度属性从 256 更改为 255。但是有没有办法配置 entity framework 核心来调整迁移?
总结一下评论中讨论的内容:
错误信息与MySQL的innodb table大多数情况下single field index length is 767 bytes的限制有关。 NormalizedEmail
字段的类型为varchar(256),字符集为utf8。 MySQL utf8 字符最长可达 3 个字节,因此本例中的索引字节长度为 256 * 3 + 2 = 770 个字节,超出了最大限制。
有 2 种可能的解决方案:
在create index
语句中手动提供一个索引长度前缀为255,缺点是不能索引整个字段
CREATE INDEX EmailIndex ON AspNetUsers (NormalizedEmail(255));
将EF代码中NormalizedEmail
字段的长度限制为255
我正在使用 AspNetCore.Identity.EntityFrameworkCore
(1.1.1) 和 SapientGuardian
(7.1.23) 生成代码优先数据库,因为我有一个 MySql 数据库 (MariaDB)。使用 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);
Email
和 NormalizedEmail
列的类型是 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 core 生成的迁移解决了这个问题。我将所有索引的最大长度属性从 256 更改为 255。但是有没有办法配置 entity framework 核心来调整迁移?
总结一下评论中讨论的内容:
错误信息与MySQL的innodb table大多数情况下single field index length is 767 bytes的限制有关。 NormalizedEmail
字段的类型为varchar(256),字符集为utf8。 MySQL utf8 字符最长可达 3 个字节,因此本例中的索引字节长度为 256 * 3 + 2 = 770 个字节,超出了最大限制。
有 2 种可能的解决方案:
在
create index
语句中手动提供一个索引长度前缀为255,缺点是不能索引整个字段CREATE INDEX EmailIndex ON AspNetUsers (NormalizedEmail(255));
- 将EF代码中
NormalizedEmail
字段的长度限制为255