【问题标题】:EF Core saves null value of required propertyEF Core 保存所需属性的空值
【发布时间】:2023-03-17 18:26:01
【问题描述】:

我有三个班级:

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,因为问题与属性类型无关

【问题讨论】:

  • 请支持 EF Core 问题#2595

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    public DateTime DOB { get; set; }
    

    EF Core 在这里使用Table-per-hierarchy。弄清楚子类型的所需属性在数据库中需要为 NULL 是足够聪明的,因为它需要能够存储其他子类型(教师)和缺少所需属性的基本类型(人)。

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

    【讨论】:

    • 该问题与属性类型无关。我编辑了我的问题。是的,你说得对,SQL 中的必需属性必须为空,但是 EF Core 是否应该允许保存必需属性的空值???
    • 您要解决的问题是什么?
    • 我不确定在这种情况下预期的行为是什么。你最初有一个DateTime?,那里的类型表明你想专门允许空值,否则你可以直接使用值类型。然后你在你的模型构建器中把它转过来,说这个属性实际上是必需的。我不知道 EF Core 应该在这里做什么。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 2017-11-05
      • 2021-12-28
      相关资源
      最近更新 更多