Я подумал, что вместо того, чтобы пытаться внести как можно меньше изменений в миграцию, я должен просто отбросить все внешние ключи и таблицы и воссоздать их с правильным типом идентификатора.
Таким образом, я можно избежать ошибок, которые выдает EF из-за изменения строки на int.
Вместо того, чтобы делать что-то подобное в миграции:
migrationBuilder
.AlterColumn<int>(
name: "Id",
table: "AspNetUsers",
oldClrType: typeof(string));
Я делаю что-то вроде этого:
migrationBuilder.DropForeignKey(name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", table: "AspNetRoleClaims");
// Drop the other FKs as well.
migrationBuilder.DropTable(name: "AspNetRoles");
// Drop the other tables as well.
migrationBuilder.CreateTable(
name: "AspNetUsers",
columns: table => new
{
Id = table.Column<int>(nullable: false),
UserName = table.Column<string>(maxLength: 256, nullable: true),
NormalizedUserName = table.Column<string>(maxLength: 256, nullable: true),
Email = table.Column<string>(maxLength: 256, nullable: true),
NormalizedEmail = table.Column<string>(maxLength: 256, nullable: true),
EmailConfirmed = table.Column<bool>(nullable: false),
PasswordHash = table.Column<string>(nullable: true),
SecurityStamp = table.Column<string>(nullable: true),
ConcurrencyStamp = table.Column<string>(nullable: true),
PhoneNumber = table.Column<string>(nullable: true),
PhoneNumberConfirmed = table.Column<bool>(nullable: false),
TwoFactorEnabled = table.Column<bool>(nullable: false),
LockoutEnd = table.Column<DateTimeOffset>(nullable: true),
LockoutEnabled = table.Column<bool>(nullable: false),
AccessFailedCount = table.Column<int>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AspNetUsers", x => x.Id);
});
// Create the other tables as well.
Хотя я не уверен, есть ли более элегантный способ заменить каждый UserId, RoleId и Id таблицы AspNetUser, AspNetRole на int.