ASP.NET Core 3.0 - не удается обновить базу данных - PullRequest
0 голосов
/ 14 октября 2019

Я только что создал проект с помощью команды dotnet new angular -o <output_directory_name> -au Individual и идентификатора скаффолда, затем установил Microsoft.EntityFrameworkCore.SqlServer, но когда я запускаю команду update-database, я получаю сообщение об ошибке ниже.

Failed executing DbCommand (4ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [AspNetRoles] (
    [Id] TEXT NOT NULL,
    [Name] TEXT(256) NULL,
    [NormalizedName] TEXT(256) NULL,
    [ConcurrencyStamp] TEXT NULL,
    CONSTRAINT [PK_AspNetRoles] PRIMARY KEY ([Id])
);

а затем в конце еще одна ошибка

Номер ошибки: 2716, Состояние: 1, Класс: 16
Столбец, параметр или переменная # 2: невозможно указать ширину столбца в тексте типа данных.

Ниже приведена сгенерированная CreateIdentitySchema миграция

migrationBuilder.CreateTable(
    name: "AspNetRoles",
    columns: table => new
    {
        Id = table.Column<string>(nullable: false),
        Name = table.Column<string>(maxLength: 256, nullable: true),
        NormalizedName = table.Column<string>(maxLength: 256, nullable: true),
        ConcurrencyStamp = table.Column<string>(nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_AspNetRoles", x => x.Id);
    });

ApplicationDbContextModelSnapshot.cs

modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
    b.Property<string>("Id")
        .HasColumnType("nvarchar(450)");

    b.Property<string>("ConcurrencyStamp")
        .IsConcurrencyToken()
        .HasColumnType("nvarchar(max)");

    b.Property<string>("Name")
        .HasColumnType("nvarchar(256)")
        .HasMaxLength(256);

    b.Property<string>("NormalizedName")
        .HasColumnType("nvarchar(256)")
        .HasMaxLength(256);

    b.HasKey("Id");

    b.HasIndex("NormalizedName")
        .IsUnique()
        .HasName("RoleNameIndex")
        .HasFilter("[NormalizedName] IS NOT NULL");

    b.ToTable("AspNetRoles");
});

Как исправить эту ошибкучтобы я мог обновить базу данных?

Изменение 'TEXT' на 'VARCHAR' в 00000000000000_CreateIdentitySchema.Designer.cs привело к следующей ошибке. То же самое происходит, когда я изменяю его на «NVARCHAR»

Data type 'VARCHAR' for property 'Id' is not supported in this form. Either specify the length explicitly in the type name, for example as 'NVARCHAR(16)', or remove the data type and use APIs such as HasMaxLength to allow EF choose the data type.

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Как уже отвечали некоторые другие, установка Identity по умолчанию, кажется, создает неправильные типы столбцов;а именно, что некоторые из столбцов Id должны быть varchar, а не текстом.

У меня были те же проблемы, что и у вас, и целую вечность я пытался эффективно их решить.

Самый быстрый способ, который я нашел, чтобы решить эту проблему, и для всех, кто сталкивался с этой проблемой, это:

  • Создать новый проект
  • Удалить папку Migrationsполностью
  • Установите пакет для Sql Server (или любой используемой вами системы данных) и сведения о строке подключения
  • Добавьте собственную миграцию, используя dotnet ef migrations add <MIGRATION NAME> или Add-Migration (это будет писать новыйФайлы конструктора миграции с нуля с правильной структурой столбцов
  • Наконец, обновите базу данных с помощью dotnet ef database update или Update-Database
0 голосов
/ 14 октября 2019

Согласно комментариям @sepupic и @PeterSmith, проблема заключалась в том, что автоматически сгенерированный код в 00000000000000_CreateIdentitySchema.Designer.cs имел TEXT поля с HasMaxLength, поэтому я изменил его на VARCHAR, затем добавил HasMaxLength(450) квсе VARCHAR идентификаторы, затем я попытался обновить базу данных снова, и это сработало.

Я запустил проект и попытался зарегистрировать пользователя, и я получил ошибку ниже

System.InvalidCastException: Невозможно привести объект типа 'System.Int32' к типу 'System.Bolean '

Поскольку у меня все еще были ошибки, я сделал следующее:

  1. Я удалил сгенерированную таблицу, затем создал новый проект с помощью команды dotnet new angular -o <output_directory_name> -au Individual
  2. Я не создал новый идентификатор для вновь созданного проекта
  3. Я скопировал имя БД из моего предыдущего проекта и выполнил команду update-database
  4. Было две отсутствующие таблицы DeviceCodes и PersistedGrants, поэтому я запустил команду add-migration, но она ничего не генерировала, поэтому я скопировал код миграции двух таблиц из моего предыдущего проекта и вставил в него пустой код миграции, который я создал ранее.
  5. Я снова запускаю проект и регистрирую нового пользователя, и он, наконец, сработал

Я до сих пор не знаю, почему я получил ошибки, так как у проекта, который я делал раньше, не былопроблема с автоматически сгенерированным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...