c# - EF Core 保存所需属性的空值

标签 c# sql-server entity-framework-core ef-core-3.1

我有三个类(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 中生成可为空的列:
SQL
它允许在 DOB 为空时保存数据:
MainContext mainContext = new MainContext();
        mainContext.Add(new Student() { DOB = null });
        mainContext.SaveChanges();
SQLResult
但是,它在没有继承的情况下工作。这是 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/

相关文章:

c# - 在 .Net 中缓存大量数据是否可以接受?

sql - #SQL Server中的表数据完整性如何?

sql-server - 具有 UNIQUE 索引的列中存在多个 NULL 值

c# - ASP.NET Core 5 Blazor WASM、gRPC、Entity Framework Core 5 : many-to-many results in stack overflow

c# - 在 docker 容器中包含 Entity Framework 工具

c# - 映射网络驱动器 : "net.exe USE" vs WshNetwork. MapNetworkDrive?

c# - 有没有办法创建一个随着树的修改而更新的 Linq XElement 迭代器?

c# - Xamarin Forms Android 中任何页面的默认背景颜色是什么?

asp.net-core - 安装 .NET 6 后无法创建 EF 迁移

c# - 将 jQuery 数据表绑定(bind)到 gridview 时出现异常