![](/img/trans.png)
[英]System.ArgumentNullException: 'Value cannot be null. Parameter name: key'
[英]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.