无法在IdentityUser上设置外键

时间:2018-09-11 17:38:37

标签: mysql ef-code-first asp.net-identity entity-framework-core asp.net-core-2.0

我正在尝试使用.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 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表设置外键?

1 个答案:

答案 0 :(得分:0)

对我来说,问题在于两个互相引用的表没有使用相同的字符集,因此MySQL拒绝设置外键约束。我认为可能是从mysqldump导入初始数据库的情况,但是本地数据库的默认数据库与sql dump的输出不匹配。