无法设置标识用户上的外键



我正在尝试使用代码优先方法使用 .NET Core 2.1 和实体框架核心(由 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 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 转储的内容不匹配。

最新更新