无法设置 IdentityUser 的外键
Foreign key on IdentityUser cannot be set
我正在尝试使用 .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; }
}
}
生成迁移看起来不错,但是当我实际尝试 运行 数据库更新时,出现 "Cannot add foreign key contstraint" 错误。
这是失败的 SQL 语句:
ALTER TABLE `Notes` ADD CONSTRAINT `FK_Notes_AspNetUsers_CreatedByUserId` FOREIGN KEY (`CreatedByUserId`) REFERENCES `AspNetUsers` (`Id`) ON DELETE NO ACTION;
这会导致更详细的错误消息:"There is no index in the referenced table where the referenced columns appear as the first columns."
但是,当我查看 AspNetUsers
table 上的索引时,我可以看到 Id
是主键,应该建立索引。这是 table:
的创建语句
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 设置外键?
原来我的问题是相互引用的两个表没有使用相同的字符集,所以 MySQL 拒绝设置外键约束。我认为这可能是我从我的 sql 转储中导入初始数据库的情况,但我本地数据库上的默认值与输出到 sql 转储的内容不匹配。
我正在尝试使用 .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; }
}
}
生成迁移看起来不错,但是当我实际尝试 运行 数据库更新时,出现 "Cannot add foreign key contstraint" 错误。
这是失败的 SQL 语句:
ALTER TABLE `Notes` ADD CONSTRAINT `FK_Notes_AspNetUsers_CreatedByUserId` FOREIGN KEY (`CreatedByUserId`) REFERENCES `AspNetUsers` (`Id`) ON DELETE NO ACTION;
这会导致更详细的错误消息:"There is no index in the referenced table where the referenced columns appear as the first columns."
但是,当我查看 AspNetUsers
table 上的索引时,我可以看到 Id
是主键,应该建立索引。这是 table:
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 设置外键?
原来我的问题是相互引用的两个表没有使用相同的字符集,所以 MySQL 拒绝设置外键约束。我认为这可能是我从我的 sql 转储中导入初始数据库的情况,但我本地数据库上的默认值与输出到 sql 转储的内容不匹配。