繁体   English   中英

EF Core 保存所需属性的空值

[英]EF Core saves null value of required property

我有三个班级:

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
{

}

我想根据需要制作字符串 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);
    }

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

SQL

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

MainContext mainContext = new MainContext();
        mainContext.Add(new Student() { DOB = null });
        mainContext.SaveChanges();

查询结果

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

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

这是 EF Core 问题还是我在模型映射中遗漏了什么?

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

首先,与 EF6 不同,EF Core 通常不执行验证。 相反,它依赖于底层数据库来做到这一点。

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

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

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

请不要建议我将其设为 DateTime DOB。

我只是建议,将 DOB 定义为:

public DateTime DOB { get; set; }

EF Core 在这里使用Table-per-hierarchy 很聪明地确定子类型的必需属性在数据库中需要为 NULL,因为它需要能够存储其他子类型 (Teacher) 和缺少所需属性的基本类型 (Person)。

我认为您正在尝试解决 EF Core 本身已解决的问题。

我认为当不存在任何值时,您的属性将为 null,并且您的 Required 属性将按预期运行。 尝试在 prop 上添加 Required 作为注释可能有效

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM