Почему EF Core генерирует asp. net таблицы идентификаторов со строковым индексом (после того, как я изменил его на int)? - PullRequest
0 голосов
/ 22 апреля 2020

На основании ответа на этот вопрос: Почему asp. net Идентификационный идентификатор пользователя является строкой?

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

На мой взгляд, это требует больших усилий. Вышеупомянутый вопрос не упоминает такого рода проблемы. Есть ли какое-то простое решение для этого или мне нужно вручную писать миграцию каждый раз, когда я создаю новый проект и пытаюсь изменить удостоверение для работы с первичным ключом на основе int?

1 Ответ

0 голосов
/ 22 апреля 2020

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

Таким образом, я можно избежать ошибок, которые выдает 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.

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