我有三个类(class):
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 中生成可为空的列:它允许在 DOB 为空时保存数据:
MainContext mainContext = new MainContext();
mainContext.Add(new Student() { DOB = null });
mainContext.SaveChanges();
但是,它在没有继承的情况下工作。这是 EF Core 问题还是我在模型映射中遗漏了什么?
编辑:我换了
DateTime?
至 string
因为问题与属性(property)类型无关
最佳答案
Is it an EF Core issue or I am missing something in model mapping?
这确实是 EF Core 问题,在 EFC 5.0 候选版本中也观察到了这一问题,因此不会解决(除非您更改数据库设计以使用 TPT)。
首先,与 EF6 不同,EF Core 通常不执行验证。相反,它依赖于底层数据库来做到这一点。
其次,由于TPH数据库继承策略将所有数据存储在一个表中,因此派生实体数据列必须允许空值,即使它们是必需的,否则将无法存储
Teacher
例如实体数据。上述两种行为的组合导致了允许派生实体的必需字段为空值的意外行为。
因此,您在映射方面无能为力(既不流畅也不使用
[Required]
数据注释)。必要的验证应由 EF Core 外部的业务逻辑层执行。
关于c# - EF Core 保存所需属性的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64676957/