繁体   English   中英

EF Core 6 错误“System.ArgumentNullException: Value cannot be null. (Parameter 'key')” using API method POST and PUT

[英]EF Core 6 error "System.ArgumentNullException: Value cannot be null. (Parameter 'key')" using API method POST and PUT

使用 post 和 put 方法时出现错误“值不能为 null(参数键)”。

所以我必须使用Radzen Blazor 对话框发送数据

我发现我在(产品和预定义元素)、(市场和预定义元素)和(驱动类型和预定义元素)之间的多对多关系导致“值不能为空”异常,但我在这里找不到 null 是什么......

以下是 Model 中定义的 market、predefinedElements、products 和 actuationType

市场:

namespace BTNLib.Shared.Models
 {
  public partial class Market
  {
    public Market()
    {
        PredefinedElements = new HashSet<PredefinedElement>();
    }

    [Key]
    public int MarketId { get; set; }
    public string? Name { get; set; }

    
    [InverseProperty(nameof(PredefinedElement.Markets))]
    public virtual ICollection<PredefinedElement> PredefinedElements { get; set; }
  }
}

预定义元素:

namespace BTNLib.Shared.Models
{
  public partial class PredefinedElement
 {
    public PredefinedElement()
    {
        ActuationTypes = new HashSet<ActuationType>();
        Markets = new HashSet<Market>();
        Products = new HashSet<Product>();
    }

  

    public string? SpoolRSideStd { get; set; }  
    [Key]
    
    public int PredefinedElementId { get; set; }
    public string? Designation { get; set; }
    public string? ConfigFileLink { get; set; }
    public string? SpoolRSideRs15Rs12 { get; set; }
    public string? SpoolRSideRs12Rs08 { get; set; }
    public int? SectionElementPositionId { get; set; }
    public int? MaxFlow { get; set; }
    public int? SectionElementTypeId { get; set; }
    public string? InternalPilotOilSupply { get; set; }
    public int? SectionBasicFunctionId { get; set; }
    public int? SectionMouvmeentNamingId { get; set; }
    public int? SectionCustomerPipingId { get; set; }
    public string? PortType { get; set; }
    public string? ConnectorType { get; set; }
    public string? Voltage { get; set; }
    public string? RpnSide { get; set; }
    public int? SliceTypeId { get; set; }
    public string? ShortInformation { get; set; }
    public string? LongInformation { get; set; }
    public string? Docupedia { get; set; }
    public string? SectionPicture { get; set; }
    public string? SectionPictureAxo { get; set; }
    public string? MasterConfigFile { get; set; }
    public string? Color { get; set; }
    public int? EfatemplateId { get; set; }
    public int? EfaAsmTemplateId { get; set; }
    public int? EfaAgzTemplateId { get; set; }
    public int? EfaGezTemplateId { get; set; }
    public int? TieRodThicknessSide1 { get; set; }
    public int? LThreadUnderNutSide1 { get; set; }
    public int? LThreadAfterNutSide1 { get; set; }
    public int? NutThicknessSide1 { get; set; }
    public int? InitialAnchorLenghSide1 { get; set; }
    public int? LThreadUnderNutSide2 { get; set; }
    public int? LThreadAfterNutSide2 { get; set; }
    public int? NutThicknessSide2 { get; set; }
    public int? InitialAnchorLenghSide2 { get; set; }




    public int? FlangeFaceInCavityId { get; set; }

   
    public int? FlangeFaceOut1CavityId { get; set; }

   
    public int? FlangeFaceOut2CavityId { get; set; }

    
    public int? RequiredFlangeFaceCavity1id { get; set; }

  
    public int? RequiredFlangeFaceCavity2id { get; set; }

    public int? RequiredFlangeFaceCavity3id { get; set; }

    
    public int? RequiredFlangeFaceCavity4id { get; set; }

  
    public int? RequiredFlangeFaceCavity5id { get; set; }


    public int? RequiredFlangeFaceCavity6id { get; set; }

    
    public int? RequiredFlangeFaceCavity7id { get; set; }

    public int? ImageId { get; set; }
    public string? Actuation { get; set; }

   
    public virtual EfaAgzTemplate? EfaAgzTemplate { get; set; }
    public virtual EfaAsmTemplate? EfaAsmTemplate { get; set; }
    public virtual EfaGezTemplate? EfaGezTemplate { get; set; }
    public virtual Efatemplate? Efatemplate { get; set; }
    public virtual Cavity? FlangeFaceInCavity { get; set; }
    public virtual Cavity? FlangeFaceOut1Cavity { get; set; }
    public virtual Cavity? FlangeFaceOut2Cavity { get; set; }
    public virtual Image? Image { get; set; }

    public virtual Cavity? RequiredFlangeFaceCavity1 { get; set; }

    public virtual Cavity? RequiredFlangeFaceCavity2 { get; set; }

    public virtual Cavity? RequiredFlangeFaceCavity3 { get; set; }

    public virtual Cavity? RequiredFlangeFaceCavity4 { get; set; }

    public virtual Cavity? RequiredFlangeFaceCavity5 { get; set; }

    public virtual Cavity? RequiredFlangeFaceCavity6 { get; set; }

    public virtual Cavity? RequiredFlangeFaceCavity7 { get; set; }

    public virtual SectionBasicFunction? SectionBasicFunction { get; set; }
    public virtual SectionCustomerPiping? SectionCustomerPiping { get; set; }
    public virtual SectionElementPosition? SectionElementPosition { get; set; }
    public virtual SectionElementType? SectionElementType { get; set; }
    public virtual SectionMouvementNaming? SectionMouvmeentNaming { get; set; }
    public virtual SliceType? SliceType { get; set; }

    

    [InverseProperty(nameof(ActuationType.PredefinedElements))]
    public virtual ICollection<ActuationType> ActuationTypes { get; set; }

    
    [InverseProperty(nameof(Market.PredefinedElements))]
    public virtual ICollection<Market> Markets { get; set; }

    
    [InverseProperty(nameof(Product.PredefinedElements))]
    public virtual ICollection<Product> Products { get; set; }
  } 
}

产品:

namespace BTNLib.Shared.Models
{
 public partial class Product
 {
    public Product()
    {
        PredefinedElements = new HashSet<PredefinedElement>();
    }
    
    [Key]
    public int ProductsId { get; set; }
    public string? Name { get; set; }

    [InverseProperty(nameof(PredefinedElement.Products))]
    public virtual ICollection<PredefinedElement> PredefinedElements { get; set; }
   }
 }

驱动类型:

namespace BTNLib.Shared.Models
{
 public partial class ActuationType
  {
    public ActuationType()
    {
        PredefinedElements = new HashSet<PredefinedElement>();
    }

    [Key]
    public int ActuationTypeId { get; set; }
    public string? Type { get; set; }

    [InverseProperty(nameof(PredefinedElement.ActuationTypes))]
    public virtual ICollection<PredefinedElement> PredefinedElements { get; set; }
  }
}

数据库上下文太长,无法在此处发布,如果您需要,我可以在回复中发布。

当我发送预定义元素的数据时是这样的:

 protected async Task Submit()
  {
    if (Designation == null)
    {
        await PredefinedElementService.CreatePredefinedElement(predefinedElement);
    }
    else
    {
        await PredefinedElementService.UpdatePredefinedElement(predefinedElement);
    }
}


void OnChangeMarket(IEnumerable<Market> values)
{
    predefinedElement.Markets.Clear();
    foreach(var Market in values)
    {
        predefinedElement.Markets.Add(Market);
    }
}

void OnChangeProduct(IEnumerable<Product> values)
{
    predefinedElement.Products.Clear();
    foreach(var Product in values)
    {
        predefinedElement.Products.Add(Product);
    }
}

void OnChangeActuationType(IEnumerable<ActuationType> values)
{
    predefinedElement.ActuationTypes.Clear();
    foreach(var ActuationType in values)
    {
        predefinedElement.ActuationTypes.Add(ActuationType);
    }
 }

它通过这样的服务调用 Post 或 Put 方法:

  public async Task CreatePredefinedElement(PredefinedElement predefinedElement)
    {

        var result = await _http.PostAsJsonAsync("api/PredefinedElements", 
         predefinedElement);
        Console.WriteLine(result);

       await SetPredefinedElement(result);
    }

 public async Task UpdatePredefinedElement(PredefinedElement predefinedElement)
    {


        var result = await 
 _http.PutAsJsonAsync($"api/PredefinedElements/{predefinedElement.PredefinedElementId}", 
  predefinedElement);
        await SetPredefinedElement(result);
    }

而 controller API 是这样的: 调用 _context.Add 或 _context.Update 时显示错误

[HttpPost]
public  async Task<ActionResult<List<PredefinedElement>>> 
     PostPredefinedElement(PredefinedElement predefinedElements)
    {

        try
        {
           
            _dbContext.PredefinedElements.Add(predefinedElements);
        }
        catch(Exception ex)
        {
            throw ex;
        }
       
        await _dbContext.SaveChangesAsync();


        return Ok(await GetdbPredefinedElement());
    }


[HttpPut("{id}")]
public async Task<ActionResult<List<PredefinedElement>>> 
   UpdatePredefinedElement(PredefinedElement predefinedElement)
    {
       
        if (predefinedElement == null)
        {
            return NotFound("Aucun element de ce type");
        }
        else
        {

            _dbContext.Update(predefinedElement);
        }
        
        await _dbContext.SaveChangesAsync();

        return Ok(await GetdbPredefinedElement());
    }


private async Task<List<PredefinedElement>> GetdbPredefinedElement()
    {
        var result = await _dbContext.PredefinedElements.Include(p => p.Products)
            .Include(p => p.Markets)
            .Include(p => p.ActuationTypes)
            .Include(p => p.Image)
            .Include(p => p.SectionElementPosition)
            .Include(p => p.SectionElementType)
            .Include(p => p.SectionBasicFunction)
            .Include(p => p.SectionMouvmeentNaming)
            .Include(p => p.SectionCustomerPiping)
            .Include(p => p.SliceType)
            .Include(p => p.Efatemplate)
            .Include(p => p.EfaAgzTemplate)
            .Include(p => p.EfaAsmTemplate)
            .Include(p => p.EfaGezTemplate)
            .Include(p => p.FlangeFaceInCavity)
            .Include(p => p.FlangeFaceOut1Cavity)
            .Include(p => p.RequiredFlangeFaceCavity1)
            .Include(p => p.RequiredFlangeFaceCavity2)
            .Include(p => p.RequiredFlangeFaceCavity3)
            .Include(p => p.RequiredFlangeFaceCavity4)
            .Include(p => p.RequiredFlangeFaceCavity5)
            .Include(p => p.RequiredFlangeFaceCavity6)
            .Include(p => p.RequiredFlangeFaceCavity7).ToListAsync();
      
        return result;
        

    }

我不知道是什么原因导致了我只知道来自多对多关系的异常,因为当我不从集合中的这种关系中添加实体时,没有显示错误。

如果没有问题,我尝试了将 [key] 放在 model 中各处的所有方法,检查我的数据库。

该项目是 2 个项目的合并,因此还有另一个数据库上下文,其中 2 个表与第一个上下文链接。

编辑:该错误仅在我尝试发布另一个预定义元素实体或修改一个结果时发生,预定义元素的两个实体具有来自表市场、产品或 ActuationType 的相同实体。

连接表中的示例 Predefinedelement_Market

预定义元素 ID:1 市场 ID:1 和预定义元素 ID:2 市场 ID:1
导致实体框架中的错误

谢谢您的帮助。

解决了:

因此,为防止出现此错误,您需要在添加元素并保存之前访问 controller:

predefinedElements.Markets = _dbContext.Markets.Where(x => predefinedElements.Markets.Contains(x)).ToList();
predefinedElements.Products = _dbContext.Products.Where(x => predefinedElements.Products.Contains(x)).ToList();
predefinedElements.ActuationTypes = _dbContext.ActuationTypes.Where(x => predefinedElements.ActuationTypes.Contains(x)).ToList();

暂无
暂无

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

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