Неверные поля создаются при настройке класса IdentityUser в asp.net Identity

asp.net-identity ef-code-first entity-framework entity-framework-6

Вопрос

Я пытаюсь настроить класс IdentityUser в asp.net-идентификаторе.

public class ApplicationUser : IdentityUser
{
    public ApplicationUser()
    {
        IsBlocked = false;
    }

    public bool IsBlocked { get; set; }
}

Проблема заключается в следующем: при первом использовании кода сначала добавляется дополнительное поле. То же самое, если я отбрасываю базу данных и воссоздаю ее.

CREATE TABLE [dbo].[AspNetUsers] (
    [Id]            NVARCHAR (128) NOT NULL,
    [UserName]      NVARCHAR (MAX) NULL,
    [PasswordHash]  NVARCHAR (MAX) NULL,
    [SecurityStamp] NVARCHAR (MAX) NULL,
    [IsConfirmed]   BIT            NOT NULL,
    [IsBlocked]     BIT            NULL,
    [Discriminator] NVARCHAR (128) NOT NULL,
    CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED ([Id] ASC)
);

Как я могу это исправить?

У меня есть логические поля в других классах в одном и том же DbContext, и все они созданы не null (как и должны).

Принятый ответ

Первоначальный ответ, ниже, предполагал, что у вас есть абстрактный базовый класс, и поэтому использовали TPC или, возможно, TPT, если вы указали атрибут [Table] для конкретного класса, а не TPH .

Однако, если вы используете неабстрактный базовый класс и не указываете [Table] на своем ApplicationUser , и поэтому ваша модель ApplicationUser и IdentityUser сопоставляются с одной таблицей, то вы используете сценарий TPH. В этом случае любые поля из подкласса будут нулевыми в вашей единственной таблице. Единственный способ изменить это - переключиться на TPC или TPT.

Оригинальный ответ

Поместите атрибут [Required] в ваше свойство:

[Required]
public bool IsBlocked { get; set; }

Затем ваша миграция должна иметь столбец NON NULL .

Однако, если у вас уже есть данные в вашей таблице, это вызовет проблемы, поскольку он не будет знать, какое значение по умолчанию нужно создать. В этом случае я редактирую миграцию, чтобы сначала сделать столбец NULL , а затем запустить команду Sql для установки значений, которые я хочу, а затем AlterColumn сделать столбец NON NULL

AddColumn("dbo.MyTable", "MyColumn", c => c.Boolean());
Sql("UPDATE MyTable SET MyColumn = 1");
AlterColumn("dbo.MyTable", "MyColumn", c => c.Boolean(nullable: false));


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему