我该如何解决.NET Core和EF Core所需字段错误?

3

我有一个.NET Core(6.0.1)API,是使用EF Core(6.0.1)的DB First方法构建的。每当我尝试将某个实体POST到API时,该实体中的其中一个导航属性会出现“必填字段”错误。我有几个结构类似但运行良好的其他实体,但这一个却让我遇到问题,我无法想出解决办法。有什么想法吗?

从DBContext:

    modelBuilder.Entity<InsuranceCompanyStatus>(entity =>
        {
            entity.HasKey(e => e.InsCoStatusId);

            entity.ToTable("InsuranceCompanyStatus");

            entity.Property(e => e.InsCoStatusId).HasColumnName("InsCoStatusID");

            entity.Property(e => e.InsuranceCompanyId).HasColumnName("InsuranceCompanyID");

            entity.Property(e => e.State)
                .HasMaxLength(2)
                .IsUnicode(false)
                .IsFixedLength();

            entity.HasOne(d => d.InsuranceCompany)
                .WithMany(p => p.InsuranceCompanyStatuses)
                .HasForeignKey(d => d.InsuranceCompanyId)
                .HasConstraintName("FK_InsuranceCompanyStatus_InsuranceCompanies");
        });

脚手架模型:

    public partial class InsuranceCompanyStatus
    {
      public int InsCoStatusId { get; set; }
      public Guid InsuranceCompanyId { get; set; }
      public string State { get; set; } = null!;
      public bool Admitted { get; set; }
      public bool? Approved { get; set; }

      public virtual InsuranceCompany InsuranceCompany { get; set; } = null!;
    }

尝试POST请求后的JSON数据:

    {
     "insuranceCompanyId": "caa3e956-a3be-4670-83e3-53a6ec47731e",
     "state": "AL",
     "admitted": true,
     "approved": true
    }

错误响应状态为400:

    {
     "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
     "title": "One or more validation errors occurred.",
     "status": 400,
     "traceId": "00-cf1de6fe8e4fb67a04ff7d4c8b6a1c68-f426059123424d72-00",
     "errors": {
        "InsuranceCompany": [
        "The InsuranceCompany field is required."
     ]
    }
    }

看到类和映射以及发布的内容是很好的,但在问题中绝不能缺少抛出异常的实际运行代码。 - Gert Arnold
2个回答

4

您需要使InsuranceCompanyId可为空

public partial class InsuranceCompanyStatus
{
    public int InsCoStatusId { get; set; }
    
    ....
    public Guid? InsuranceCompanyId { get; set; }
    
    public virtual InsuranceCompany InsuranceCompany { get; set; }  // = null!; you don't need it , it is null by default
}

通常情况下它可以正常工作,但如果仍然无法运行,您可以在流利的应用程序中明确添加它。

 modelBuilder.Entity<InsuranceCompanyStatus>(entity =>
 {
   .....  
   entity.Property(e => e.InsuranceCompanyId).IsOptional(); 


2
我有以下情况:
  • 我的表中有一个非空外键;
  • C#8.0引入了可空引用类型 - 是的,这是一种变量类型指定,说明它的数据类型是可以为null的引用(我认为这是隐式的,但这里对它们的情况进行了一些澄清);
  • EF 6 开始使用它

当我尝试插入新记录时,FK导航属性上收到“字段是必需的”错误。 如果我将FK更改为DB中的可空列并重新生成代码,则一切正常。

相关的EFCore Github项目问题中,有一些基本原理和“按设计决策”,但是对我来说太多了,所以我选择了简单的方法。

这是原始的EF生成的代码:

namespace DAback.Models
{
    public partial class Patient
    {
        // ...
        public int CurrentQueue { get; set; }  // FK to Queue table

        public virtual Queue CurrentQueueNavigation { get; set; } = null!;
    }
“字段是必需的”错误是因为传递给插入方法的对象在CurrentQueueNavigation属性上没有值(尽管CurrentQueue已被填充)而引起的。
我尝试了这里关于声明get/set属性为可空,并在上下文初始化(OnModelCreating)期间设置脚手架属性为非必需的建议,但是没有效果。所以我将导航属性类型声明为可空引用类型,一切都正常工作了:
namespace DAback.Models
{
    public partial class Patient
    {
        // ...
        public int CurrentQueue { get; set; }  // FK to Queue table

        // Using "Queue?" instead of "Queue" so EF now knows this
        // object doesn't need to be present on deserialization
        // i.e., it can be null
        public virtual Queue? CurrentQueueNavigation { get; set; } = null!;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接