我是一名 PHP/MySQL 开发人员,正在尝试转向 .NET Core 等其他技术。我不确定我是否喜欢通过 MySQL 切换到 SQL Server 的想法(由于许可),所以我一直在尝试让 .NET Core 与 MySQL 很好地配合。
我已经建立了一个相当基本的 .NET Core 2.0 项目,使用 Identity 作为身份验证方法,当数据库驱动程序是 SqlLite
和本地数据库时,一切工作正常。我尝试切换到 MySQL
数据库并运行我的迁移,但它们失败了。
我收到错误:指定的 key 太长;最大 key 长度为 3072 字节
尝试运行以下表创建查询时:
CREATE TABLE `AspNetUserTokens` (
`UserId` varchar(767) NOT NULL,
`LoginProvider` varchar(767) NOT NULL,
`Name` varchar(767) NOT NULL,
`Value` text NULL,
PRIMARY KEY (`UserId`, `LoginProvider`, `Name`)
);
我的 Mysql 数据库使用 UTF8mb4
字符集,因此它不能使用上面指定的主键,它大约有 9204 字节。
如何自定义默认身份表的创建方式?如果可能的话,我想用这个表上一个更合理的主键替换大键,它只是一个自动递增
整数。
有没有什么方法可以自定义默认身份相关表的创建方式,而无需手动修改迁移文件。有什么方法可以在我的 ApplicationDbContext
的 OnModelCreating
方法中做些什么?我应该停止与 MySQL 抗争并屈服于 MS SQL 吗?
编辑
我能够通过使用 Pomelo MySQL Driver 解决这个问题而不是甲骨文。 Pomelo 驱动程序似乎将字符串字段默认为最大长度 127 个字符,这允许上述键符合 3072 字节的限制。但是,我仍然有兴趣了解如何微调和自定义 .NETCore 脚手架中提供的基本身份表。
最佳答案
我只是想添加到@neville 的答案,让其他人使用默认的 MySql.Data.EntityFrameworkCore nuget 包来解决问题。
您需要在 dbcontext OnModelCreating 中添加以下键的最大长度,然后运行 add-migration 才能生效。
在这里创建一个示例 https://github.com/k-siddharatha/DotNetCoreEFMySql
就是为了这个问题。
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<IdentityUser>(entity => entity.Property(m => m.Id).HasMaxLength(85));
builder.Entity<IdentityUser>(entity => entity.Property(m => m.NormalizedEmail).HasMaxLength(85));
builder.Entity<IdentityUser>(entity => entity.Property(m => m.NormalizedUserName).HasMaxLength(85));
builder.Entity<IdentityRole>(entity => entity.Property(m => m.Id).HasMaxLength(85));
builder.Entity<IdentityRole>(entity => entity.Property(m => m.NormalizedName).HasMaxLength(85));
builder.Entity<IdentityUserLogin<string>>(entity => entity.Property(m => m.LoginProvider).HasMaxLength(85));
builder.Entity<IdentityUserLogin<string>>(entity => entity.Property(m => m.ProviderKey).HasMaxLength(85));
builder.Entity<IdentityUserLogin<string>>(entity => entity.Property(m => m.UserId).HasMaxLength(85));
builder.Entity<IdentityUserRole<string>>(entity => entity.Property(m => m.UserId).HasMaxLength(85));
builder.Entity<IdentityUserRole<string>>(entity => entity.Property(m => m.RoleId).HasMaxLength(85));
builder.Entity<IdentityUserToken<string>>(entity => entity.Property(m => m.UserId).HasMaxLength(85));
builder.Entity<IdentityUserToken<string>>(entity => entity.Property(m => m.LoginProvider).HasMaxLength(85));
builder.Entity<IdentityUserToken<string>>(entity => entity.Property(m => m.Name).HasMaxLength(85));
builder.Entity<IdentityUserClaim<string>>(entity => entity.Property(m => m.Id).HasMaxLength(85));
builder.Entity<IdentityUserClaim<string>>(entity => entity.Property(m => m.UserId).HasMaxLength(85));
builder.Entity<IdentityRoleClaim<string>>(entity => entity.Property(m => m.Id).HasMaxLength(85));
builder.Entity<IdentityRoleClaim<string>>(entity => entity.Property(m => m.RoleId).HasMaxLength(85));
}
关于mysql - .NET Core 2.0 与 MySQL : Specified key was too long; max key length is 3072 bytes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48678495/