3

我正尝试在asp.net标识中自定义IdentityUser类。在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上的其他类中有布尔字段,它们都被创建为非空(因为它们应该)。

回答

5

原始答案如下,假设您有一个抽象基类,因此如果您在具体类中指定[Table]属性,而不是TPH,则使用TPC或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)); 
+0

我都试过,但没有任何改变。再次说明:在同一DbContext上的其他实体中,不可为空的类型(包括bool)的所有属性在数据库中产生不可为空的字段。问题只在于这一个。 – aleyush

+0

你有可能使用TPH吗?如果是这样,那么你可能不能使该特定字段非空。 –

+0

你说得对,在我的情况下是TPH的情况。 – aleyush

相关问题