无法设置IdentityUser上的外键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法设置IdentityUser上的外键相关的知识,希望对你有一定的参考价值。

我正在尝试使用.NET Core 2.1和Entity Framework Core(由mysql支持)使用代码优先方法创建一个带有外键的新模型,该模型使用IdentityUser。我创建了一个如下所示的模型:

using System;
using Microsoft.AspNetCore.Identity;

namespace Models
{
    public class Note
    {
        public int NoteId { get; set; }

        public string NoteText { get; set; }

        public string CreatedByUserId { get; set; }
        public virtual IdentityUser CreatedByUser { get; set; }
    }
}

生成迁移看起来不错,但是当我实际尝试运行数据库更新时,我得到一个“无法添加外键约束”错误。

这是它失败的SQL语句:

ALTER TABLE `Notes` ADD CONSTRAINT `FK_Notes_AspNetUsers_CreatedByUserId` FOREIGN KEY (`CreatedByUserId`) REFERENCES `AspNetUsers` (`Id`) ON DELETE NO ACTION;

这导致稍微更详细的错误消息:“引用的表中没有索引,其中引用的列显示为第一列。”

但是,当我查看AspNetUsers表上的索引时,我可以看到Id是主键,应该编入索引。这是表的create语句:

CREATE TABLE aspnetusers
(
  Id                   VARCHAR(127) NOT NULL
    PRIMARY KEY,
  AccessFailedCount    INT          NOT NULL,
  ConcurrencyStamp     LONGTEXT     NULL,
  Email                VARCHAR(256) NULL,
  EmailConfirmed       BIT          NOT NULL,
  LockoutEnabled       BIT          NOT NULL,
  LockoutEnd           DATETIME(6)  NULL,
  NormalizedEmail      VARCHAR(256) NULL,
  NormalizedUserName   VARCHAR(256) NULL,
  PasswordHash         LONGTEXT     NULL,
  PhoneNumber          LONGTEXT     NULL,
  PhoneNumberConfirmed BIT          NOT NULL,
  SecurityStamp        LONGTEXT     NULL,
  TwoFactorEnabled     BIT          NOT NULL,
  UserName             VARCHAR(256) NULL,
  CONSTRAINT UserNameIndex
  UNIQUE (NormalizedUserName)
)
  ENGINE = InnoDB
  CHARSET = latin1;

CREATE INDEX EmailIndex
  ON aspnetusers (NormalizedEmail);

我也尝试使用NormalizedUserNameNormalizedEmail代替Id,因为它们看起来都是索引字段,显示为各自索引中的唯一字段,但我得到了所有这些字段的相同错误消息。

如何设置IdentityUser表的外键?

答案

事实证明,问题是两个引用彼此的表没有使用相同的字符集,因此MySQL拒绝设置外键约束。我认为可能是我从mysqldump导入初始数据库的情况,但我本地数据库的默认值与输出到sql转储的默认值不匹配。

以上是关于无法设置IdentityUser上的外键的主要内容,如果未能解决你的问题,请参考以下文章

powerdesigner12的外键怎么设置和删除?

视图上的外键引用

运行所选代码生成器时出错:无法检索 xxx.Goal 的元数据 .. 由应用程序用户的外键引起

继承表的外键名称

如何解决无法添加或更新子行:Spring JPA 中的外键约束失败错误?

:完整性约束违规:1452 无法添加或更新子行:laravel 迁移中的外键约束失败