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警告。
修复步骤
- 在构建WebApplication之前注册InMemory DbContext
- 修正错误的查询接口路由,将查询参数从路由模板中移除,通过
[FromQuery]绑定 - 给
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
相关产品推荐
相关产品推荐

