EF Core 保存所需属性的空值

Dil*_*d K 5 c# sql-server entity-framework-core ef-core-3.1

我有三个班级:

public class Person
{
    public string Name { get; set; }
    public Guid Guid { get; set; }
}

public class Student : Person
{
    public string DOB { get; set; }
}


public class Teacher : Person
{

}
Run Code Online (Sandbox Code Playgroud)

我想根据需要制作字符串 DOB,我正在这样做:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>().HasKey(d => d.Guid);
        modelBuilder.Entity<Student>().Property(d => d.DOB).IsRequired(true);
        modelBuilder.Entity<Teacher>();
        base.OnModelCreating(modelBuilder);
    }
Run Code Online (Sandbox Code Playgroud)

在 SQL EF Core 中生成可为空的列:

SQL

它允许在 DOB 为空时保存数据:

MainContext mainContext = new MainContext();
        mainContext.Add(new Student() { DOB = null });
        mainContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

查询结果

但是,它在没有继承的情况下工作。这是 EF Core 问题还是我在模型映射中遗漏了什么?

编辑:我替换DateTime?string因为问题与属性类型无关

Iva*_*oev 5

这是 EF Core 问题还是我在模型映射中遗漏了某些内容?

这确实是 EF Core 问题,在 EFC 5.0 候选版本中也观察到了这一问题,因此不会得到解决(除非您更改数据库设计以利用 TPT)。

首先,与 EF6 不同,EF Core 通常不执行验证。相反,它依赖底层数据库来完成此操作。

其次,由于 TPH 数据库继承策略将所有数据存储在单个表中,因此派生实体数据列必须允许为 null,即使它们是必需的,否则您将无法存储Teacher实体数据等。

上述两种行为的组合会导致派生实体的必填字段允许空值的意外行为。

因此,您在映射方面无能为力(无论是流畅还是[Required]数据注释)。必要的验证应由 EF Core 外部的业务逻辑层执行。