在asp.net Identity中自定义IdentityUser类时会创建可为空的字段

ale*_*ush 3 entity-framework ef-code-first entity-framework-6 asp.net-identity

我试图在asp.net身份中自定义IdentityUser类.

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

    public bool IsBlocked { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

问题是:使用代码优先迁移时,附加字段创建为可空.如果我删除数据库并重新创建它也是一样的.

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)
);
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

我在同一个DbContext上的其他类中有布尔字段,并且它们都是非空的(因为它们应该).

And*_*own 5

下面的原始答案假设您有一个抽象基类,因此使用TPC,或者如果您[Table]在具体类上指定了属性而不是TPH,则可能使用TPT .

但是,如果您使用的是非抽象基类,并且未[Table]在您的基础上指定ApplicationUser,并且因此您ApplicationUserIdentityUser映射到单个表,那么您正在使用TPH方案.在这种情况下,子类中的任何字段都可以在单个表中为空.改变这种情况的唯一方法是切换到TPC或TPT.

原始答案

[Required]属性放在您的属性上:

[Required]
public bool IsBlocked { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后,您的迁移应该成为一个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));
Run Code Online (Sandbox Code Playgroud)