EF 迁移忽略字符串属性上的 [Required] 属性并创建可为 null 的字段

Vin*_*els 4 entity-framework asp.net-mvc-5 entity-framework-migrations

我一定错过了一些微不足道的事情。我想这是我第一次遇到这种情况。

ApplicationUser : IdentityUser用一些基本数据扩展了我的课程。其中一些是必需的,一些是可选的。简化摘录:

public class ApplicationUser : IdentityUser
{
    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    [Column(TypeName = "Date")]
    public DateTime? BirthDate { get; set; }

    public string NationalNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

请注意,FirstNameLastName是必需的,NationalNumber不是。BirthDate, 存在nullable, 也不是。这会产生以下自动生成的代码:

CreateTable(
    "dbo.AspNetUsers",
    c => new
    {
        Id = c.String(nullable: false, maxLength: 128),
        UserName = c.String(),
        PasswordHash = c.String(),
        SecurityStamp = c.String(),
        FirstName = c.String(),
        LastName = c.String(),
        BirthDate = c.DateTime(storeType: "date"),
        NationalNumber = c.String(),
        Discriminator = c.String(nullable: false, maxLength: 128),
    })
    .PrimaryKey(t => t.Id);
Run Code Online (Sandbox Code Playgroud)

唯一创建的列nullable: false是从类继承的Id和列。为什么我的属性被忽略了?DiscriminatorIdentityUser[Required]

Col*_*lin 5

您正在使用继承,并且 EF 默认情况下使用每个层次结构表来实现该继承。IdentityUsers和ApplicationUsers将存储在同一个表中。但IdentityUsers 没有FirstNameLastName属性,因此数据库中的字段必须可为空。如果这对您来说是个问题,那么您需要使用其他策略之一:

每个类型的表每个具体类型的表