You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core Minimal API 运行报错无法推断一个或多个参数如何解决

错误原因

你遇到的Failure to infer one or more parameters报错由两个核心问题导致:

  • 未注册DbContext服务:代码中使用了ProductsDb作为接口注入参数,但没有在服务容器中注册Entity Framework InMemory对应的DbContext服务,Minimal API无法识别该参数的来源。
  • 非法路由模板与参数不匹配:你写的MapGet("/inventory/items/query?category={category}"不符合路由规则:路由模板不能包含查询字符串(?之后的内容),且模板中声明的category参数和实际接口使用的int bc参数完全不匹配,导致参数推断失败。
    另外存在两个潜在问题:Product类未显式指定主键,可空引用类型未处理会触发EF Core警告。

修复步骤

  1. 在构建WebApplication之前注册InMemory DbContext
  2. 修正错误的查询接口路由,将查询参数从路由模板中移除,通过[FromQuery]绑定
  3. 给Product类补充主键标记和字符串默认值

完整修复后代码

using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel.DataAnnotations;

var builder = WebApplication.CreateBuilder(args);

// 注册InMemory数据库服务
builder.Services.AddDbContext<ProductsDb>(opt =>
    opt.UseInMemoryDatabase("ProductsDb"));

var app = builder.Build();

app.UseHttpsRedirection();

app.MapGet("/", () => "Hello world !");

// CREATE NEW ITEM /INVENTORY/ITEM
app.MapPost("/inventory/item", async (Product product, ProductsDb db) =>
{
    db.Products.Add(product);
    await db.SaveChangesAsync();
    return Results.Created($"/inventory/{product.Barcode}", product);
});

// DELETE ITEM /ITEM
app.MapDelete("/item/{bc}", async (int bc, ProductsDb db) =>
{
    if (await db.Products.FindAsync(bc) is Product product)
    {
        db.Products.Remove(product);
        await db.SaveChangesAsync();
        return Results.Ok(product);
    }
    return Results.NotFound();
});

// UPDATE ITEM /INVENTORY/item/{barecode}
app.MapPut("/inventory/item/{bc}", async (int bc, Product inputProduct, ProductsDb db) =>
{
    var product = await db.Products.FindAsync(bc);
    if (product is null) return Results.NotFound();
    product.Name = inputProduct.Name;
    product.Category = inputProduct.Category;
    product.Price = inputProduct.Price;
    product.Discount = inputProduct.Discount;
    product.Quantity = inputProduct.Quantity;
    await db.SaveChangesAsync();
    return Results.NoContent();
});

// GET ALL ITEMS  /INVENTORY/ITEMS
app.MapGet("/inventory/item", async (ProductsDb db) =>
    await db.Products.ToListAsync());

// 修复后的按条码查询接口,参数从Query中获取
app.MapGet("/inventory/items/query", async ([FromQuery] int bc, ProductsDb db) =>
    await db.Products.FindAsync(bc)
        is Product product
            ? Results.Ok(product)
            : Results.NotFound());

// GET ALL ITEMS SORTED IN DESCENDING /INVENTORY/ITEM/SORT
app.MapGet("/inventory/item/sort", async (ProductsDb db) =>
    await db.Products.OrderBy(p => p.Price).ToListAsync());

app.Run();

class Product
{
    [Key] // 显式指定主键
    public int Barcode { get; set; }
    public string Name { get; set; } = string.Empty; // 给字符串默认值避免可空警告
    public string Category { get; set; } = string.Empty;
    public int Price { get; set; }
    public int Discount { get; set; }
    public int Quantity { get; set; }
}

class ProductsDb : DbContext
{
    public ProductsDb(DbContextOptions<ProductsDb> options)
        : base(options) { }
    public DbSet<Product> Products => Set<Product>();
}

内容的提问来源于stack exchange,提问作者MAMAafrica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:45:06