我正在尝试在 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(使用前将#替换为@)