我正在尝试创建一个外键为 IdentityUser
使用.net core 2.1和entity framework core(由mysql支持),使用代码优先的方法。我创建了一个如下的模型:
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; }
}
}
生成迁移看起来不错,但是当我实际尝试运行数据库更新时,出现了“cannotaddforeign key contstraint”错误。
下面是它失败的sql语句:
ALTER TABLE `Notes` ADD CONSTRAINT `FK_Notes_AspNetUsers_CreatedByUserId` FOREIGN KEY (`CreatedByUserId`) REFERENCES `AspNetUsers` (`Id`) ON DELETE NO ACTION;
这将导致一条稍微详细一点的错误消息:“在引用的表中没有索引,其中引用的列显示为第一列。”
但是,当我看到 AspNetUsers
table,我看得出来 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);
我也试过使用 NormalizedUserName
以及 NormalizedEmail
代替 Id
因为它们看起来都是索引字段,显示为各自索引中的唯一字段,但我得到的错误消息都是相同的。
如何设置 IdentityUser
table?
1条答案
按热度按时间gkl3eglg1#
对我来说,问题是引用彼此的两个表没有使用相同的字符集,所以mysql拒绝设置外键约束。我想可能是我从mysqldump导入了初始db,但是本地db的默认值与输出到sql dump的值不匹配。