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

2023-12-15

我正在尝试在 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 上的其他类中有布尔字段,并且它们都创建为非空(因为它们应该)。


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

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

原答案

Put the [Required]您的财产属性:

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

然后您的迁移应该使其成为NON NULL column.

但是,如果表中已有数据,这将导致问题,因为它不知道要创建什么默认值。在本例中,我编辑迁移以首先使其成为NULL列,然后运行Sql命令设置我想要的值,然后AlterColumn使它成为NON NULL column

AddColumn("dbo.MyTable", "MyColumn", c => c.Boolean());
Sql("UPDATE MyTable SET MyColumn = 1");
AlterColumn("dbo.MyTable", "MyColumn", c => c.Boolean(nullable: false));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 asp.net Identity 中自定义 IdentityUser 类时会创建可为 Null 的字段 的相关文章

随机推荐