【问题标题】:Foreign key on IdentityUser cannot be set无法设置 IdentityUser 上的外键
【发布时间】:2019-02-16 06:46:39
【问题描述】:

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

【问题讨论】:

  • 您实际上是直接使用IdentityUser,还是使用ApplicationUser之类的东西派生出来?
  • 我尝试了这两种方法并得到了相同的结果。我认为这指向了一个与简单地使用 IdentityUser 不同的问题。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-05-08
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2017-03-14
    • 2015-03-12
    • 1970-01-01
    相关资源
    最近更新 更多