3

我正在尝试在 asp.net 身份中自定义 IdentityUser 类。

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(它们应该如此)。

4

1 回答 1

5

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

但是,如果您使用的是非抽象基类,并且没有[Table]在您的ApplicationUser,因此您的ApplicationUserIdentityUser映射到单个表上指定 a,那么您正在使用 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));
于 2013-10-24T14:48:11.397 回答