ASP.NET Core MVC с начальным переносом идентификатора завершается неудачно с ALTER COLUMN для таблицы идентификаторов - PullRequest
0 голосов
/ 24 мая 2019

При создании нового проекта ASP.NET Core MVC (Core 2.2) с индивидуальной аутентификацией начальная миграция завершается с ошибкой «Чтобы изменить свойство IDENTITY столбца, столбец необходимо удалить и создать заново».

Выполнен следующий процесс:

  • Создать проект с использованием dotnet new mvc -o <myapp> -auth Individual
  • Изменить строку подключения и перейти к SQlServer express, работающему локально
  • Измените файл startup.cs, чтобы использовать SQLServer вместо SQLite
  • Запустите начальную миграцию для идентификации, используя dotnet ef database update успешно
  • Добавьте новые модели для приложения
  • Измените ApplicationDbContext, чтобы он содержалновые DbSets для моделей приложений.
  • Создание новой миграции `dotnet efigration add
  • Обновление базы данных с использованием dotnet ef database update

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

Вопрос:

  1. Почему EF необходимо изменить столбец для уже существующей таблицы, если не было внесено никаких изменений.
  2. Как решить эту проблему.

Допущения:

  1. Я использую тот же ApplicationDbContext, поскольку хочу, чтобы таблицы Identity находились в той же базе данных, что и данные приложения.
  2. Желательно ли использовать 2 DbContexts, указывающих на одну и ту же БД?
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;

namespace CetaMonitor.Data.Migrations
{
    public partial class InitialModel : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropIndex(
                name: "UserNameIndex",
                table: "AspNetUsers");

            migrationBuilder.DropIndex(
                name: "RoleNameIndex",
                table: "AspNetRoles");

            migrationBuilder.AlterColumn<int>(
                name: "Id",
                table: "AspNetUserClaims",
                nullable: false,
                oldClrType: typeof(int))
                .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

            migrationBuilder.AlterColumn<int>(
                name: "Id",
                table: "AspNetRoleClaims",
                nullable: false,
                oldClrType: typeof(int))
                .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

            migrationBuilder.CreateTable(
                name: "Entity",
                columns: table => new
                {
                    ID = table.Column<int>(nullable: false)
                        .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                    EntityName = table.Column<string>(nullable: true),
                    MainContact = table.Column<string>(nullable: true),
                    Address = table.Column<string>(nullable: true),
                    Province = table.Column<int>(nullable: false),
                    TelephoneNumbers = table.Column<string>(nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Entity", x => x.ID);
                });

            migrationBuilder.CreateIndex(
                name: "UserNameIndex",
                table: "AspNetUsers",
                column: "NormalizedUserName",
                unique: true,
                filter: "[NormalizedUserName] IS NOT NULL");

            migrationBuilder.CreateIndex(
                name: "RoleNameIndex",
                table: "AspNetRoles",
                column: "NormalizedName",
                unique: true,
                filter: "[NormalizedName] IS NOT NULL");
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Entity");

            migrationBuilder.DropIndex(
                name: "UserNameIndex",
                table: "AspNetUsers");

            migrationBuilder.DropIndex(
                name: "RoleNameIndex",
                table: "AspNetRoles");

            migrationBuilder.AlterColumn<int>(
                name: "Id",
                table: "AspNetUserClaims",
                nullable: false,
                oldClrType: typeof(int))
                .OldAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

            migrationBuilder.AlterColumn<int>(
                name: "Id",
                table: "AspNetRoleClaims",
                nullable: false,
                oldClrType: typeof(int))
                .OldAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

            migrationBuilder.CreateIndex(
                name: "UserNameIndex",
                table: "AspNetUsers",
                column: "NormalizedUserName",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "RoleNameIndex",
                table: "AspNetRoles",
                column: "NormalizedName",
                unique: true);
        }
    }
}

Я ожидаю, что новая миграция будет работать нормально и не будет зависеть от таблиц Identity.

...