我正在尝试在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上的其他类中有布尔字段,并且它们都是非空的(因为它们应该)。
答案 0 :(得分:5)
下面的原始答案假设您有一个抽象基类,因此使用TPC,或者如果您在具体类中指定[Table]
属性而不是TPH,则可能使用TPT。
但是,如果您使用的是非抽象基类,并且未在[Table]
上指定ApplicationUser
,那么您的ApplicationUser
和IdentityUser
会映射到单表,然后您正在使用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));