При создании нового проекта 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 столбца,столбец должен быть удален и воссоздан ", связанный с кодом ниже.
Вопрос:
- Почему EF необходимо изменить столбец для уже существующей таблицы, если не было внесено никаких изменений.
- Как решить эту проблему.
Допущения:
- Я использую тот же ApplicationDbContext, поскольку хочу, чтобы таблицы Identity находились в той же базе данных, что и данные приложения.
- Желательно ли использовать 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.