gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:41:48 27 4
gpt4 key购买 nike

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

最佳答案

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

但是,如果您使用的是非抽象基类并且未在您的 ApplicationUser 上指定 [Table],因此您的 ApplicationUserIdentityUser 映射到单个表,那么您正在使用 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));

关于entity-framework - 在 asp.net Identity 中自定义 IdentityUser 类时创建可为空的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19566258/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com