Mysql Entity Framework 问题 - 指定的键太长;最大密钥长度为 3072 字节
Posted
技术标签:
【中文标题】Mysql Entity Framework 问题 - 指定的键太长;最大密钥长度为 3072 字节【英文标题】:Mysql Entity Framework issue - Specified key was too long; max key length is 3072 bytes 【发布时间】:2018-01-22 19:23:19 【问题描述】:当我使用这个命令时:
$ dotnet ef database update
我收到此错误:
指定的密钥太长;最大密钥长度为 3072 字节
导致此错误的表是用于用户管理的内置 Microsoft 表:
CREATE TABLE `AspNetUserLogins`
(
`LoginProvider` varchar(767) NOT NULL,
`ProviderKey` varchar(767) NOT NULL,
`ProviderDisplayName` text NULL,
`UserId` varchar(767) NOT NULL,
PRIMARY KEY (`LoginProvider`, `ProviderKey`),
CONSTRAINT `FK_AspNetUserLogins_AspNetUsers_UserId`
FOREIGN KEY (`UserId`) REFERENCES `AspNetUsers` (`Id`)
ON DELETE CASCADE
);
我尝试将此添加到OnModelCreating
:
modelBuilder.Entity<Utilisateurs>(entity => entity.Property(m => m.NormalizedEmail).HasMaxLength(200));
modelBuilder.Entity<Utilisateurs>(entity => entity.Property(m => m.NormalizedUserName).HasMaxLength(200));
modelBuilder.Entity<IdentityRole>(entity => entity.Property(m => m.NormalizedName).HasMaxLength(200));
modelBuilder.Entity<IdentityUserLogin<string>>(entity => entity.Property(m => m.UserId).HasMaxLength(200));
modelBuilder.Entity<IdentityUserRole<string>>(entity => entity.Property(m => m.UserId).HasMaxLength(200));
modelBuilder.Entity<IdentityUserRole<string>>(entity => entity.Property(m => m.RoleId).HasMaxLength(200));
modelBuilder.Entity<IdentityUserToken<string>>(entity => entity.Property(m => m.UserId).HasMaxLength(200));
modelBuilder.Entity<IdentityUserClaim<string>>(entity => entity.Property(m => m.UserId).HasMaxLength(200));
modelBuilder.Entity<IdentityRoleClaim<string>>(entity => entity.Property(m => m.RoleId).HasMaxLength(200));
但它不再起作用了。
感谢您的帮助
** 编辑 **
我也试过了:
modelBuilder.Entity<IdentityUserLogin<string>>(entity => entity.Property(m => m.LoginProvider).HasMaxLength(200));
modelBuilder.Entity<IdentityUserLogin<string>>(entity => entity.Property(m => m.ProviderKey).HasMaxLength(200));
【问题讨论】:
据我所知,您需要限制LoginProvider
和ProviderKey
实体的IdentityUserLogin<string>
属性的最大长度
谢谢,但是怎么做?
类似于您在 OnModelCreating
中为其他属性所做的操作 - 例如modelBuilder.Entity<IdentityUserLogin<string>>(entity => entity.Property(m => m.LoginProvider).HasMaxLength(760);
ProviderKey
相同。
我试过(见我的编辑)但它不起作用
您是否重新生成了迁移?还要确保您的代码在base.OnModelCreating
调用之后。
【参考方案1】:
我使用了官方的 mysql 提供程序MySql.Data.EntityFrameworkCore
,它处于预发布状态并且在迁移时遇到了一些问题。然后我更改为Pomelo.EntityFrameworkCore.MySql
并更新数据库没有任何错误。
【讨论】:
【参考方案2】:将 MySql.Data.EntityFrameworkCore 更新到当前版本并检查您的项目支持哪些连接器 https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core.html#connector-net-entityframework-core-versions
还有mysql网站上的例子
https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core-example.html
【讨论】:
以上是关于Mysql Entity Framework 问题 - 指定的键太长;最大密钥长度为 3072 字节的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 6 Code First +MVC5+MySql/Oracle使用过程中的两个问题
在 Entity Framework 6 中使用 MySQL 和 MSSQL
Entity Framework 6 的动态 MySQL 数据库连接
Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended