使用EF Core

时间:2017-04-28 09:23:51

标签: mysql .net asp.net-identity mariadb entity-framework-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);

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核心生成的迁移解决了这个问题。我将所有索引的max length属性从256更改为255.但是有没有办法配置实体框架核心来调整迁移?

1 个答案:

答案 0 :(得分:3)

总结一下评论中讨论的内容:

错误消息与MySQL的innodb表中大多数情况下single field index length is 767 bytes的限制有关。 NormalizedEmail字段的类型为varchar(256),字符集为utf8。在MySQL中,utf8字符最长可达3个字节,因此在这种情况下索引字节长度为256 * 3 + 2 = 770字节,这比最大限制长。

有两种可能的解决方案:

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

    CREATE INDEX EmailIndex ON AspNetUsers (NormalizedEmail(255));
    
  2. 使用maximum length restriction在EF代码中将NormalizedEmail字段的长度限制为255.