Внешний ключ на IdentityUser не может быть установлен - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь создать новую модель с внешним ключом для 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; }
    }
}

Генерация миграции выглядит хорошо, но когда я на самом деле пытаюсь запустить обновление базы данных, я получаю «Невозможно добавить consttraint внешнего ключа» ошибка.

Вот оператор SQL, на котором он не выполняется:

ALTER TABLE `Notes` ADD CONSTRAINT `FK_Notes_AspNetUsers_CreatedByUserId` FOREIGN KEY (`CreatedByUserId`) REFERENCES `AspNetUsers` (`Id`) ON DELETE NO ACTION;

Это приводит к чуть более подробному сообщению об ошибке: "В указанной таблице нет индексагде указанные столбцы отображаются как первые столбцы. "

Однако, когда я смотрю на индексы в таблице AspNetUsers, я вижу, что 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?

1 Ответ

0 голосов
/ 13 сентября 2018

Оказывается, проблема для меня заключалась в том, что две таблицы, которые ссылались друг на друга, не использовали один и тот же набор символов, поэтому MySQL отказывался устанавливать ограничение внешнего ключа. Я думаю, что это может быть тот случай, когда я импортировал исходный БД из mysqldump, но значения по умолчанию на моем локальном БД не соответствовали тому, что было выведено в дамп sql.

...