mysql - .NET Core 2.0 与 MySQL : Specified key was too long; max key length is 3072 bytes

标签 mysql asp.net-identity asp.net-core-2.0

我是一名 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 字节。

如何自定义默认身份表的创建方式?如果可能的话,我想用这个表上一个更合理的主键替换大键,它只是一个自动递增整数。

有没有什么方法可以自定义默认身份相关表的创建方式,而无需手动修改迁移文件。有什么方法可以在我的 ApplicationDbContextOnModelCreating 方法中做些什么?我应该停止与 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/

相关文章:

c# - 防止 ASP.NET Identity 的 UserManager 自动保存

azure - Netcoreapp2.0 无法在 Azure 应用服务中启动,出现错误 500 并且没有日志

MySQL SELECT 将天数间隔添加到日期时间列

mysql - 操作数应包含 1 列 ruby​​ on Rails

asp.net-mvc - UserManager verifyUserTokenAsync 始终为 False

c# - INSERT 语句与 FOREIGN KEY 约束错误冲突

asp.net-core - ASP .NET Core https 重写似乎不起作用

asp.net-web-api - Web Api Core 2 区分 GET

python - 如何使用 MySQLdb 格式化多个字符串 (%s)?

c# - 我应该为每个类别使用单独的表还是一个表来存储分类网站的所有属性?