【发布时间】:2020-08-31 22:23:03
【问题描述】:
我在一个控制器中有两个 get 语句
[HttpGet("{projectId:int}")]
public async Task<ActionResult<Models.Project>> GetById(int projectId)
{
var project = await _context.Projects.FindAsync(projectId);
if (project == null)
{
return NotFound();
}
return project;
}
// GET: api/project/5
[HttpGet("{projectCode}")]
public async Task<ActionResult<Project>> GetProjectByProjectCode(string projectCode)
{
var projects = await _context.Projects.FindAsync(projectCode);
if (projects == null)
{
return NotFound();
}
return projects;
}
第一个 get 完美运行,完成了它应该做的事情,传入一个 ID 并返回与该 ID 关联的项目
第二个 get 无法正常工作。它应该做的是传入一个 projectCode 参数(字符串)并返回与该项目代码关联的项目。
项目代码的格式如下--7000316139.13.01-- 所以这就是我使用字符串参数传递它的原因
当我大摇大摆地运行 api 时,出现以下错误
System.ArgumentException:调用“DbSet.Find”的位置 0 处的键值属于“字符串”类型,与 'int' 的属性类型。在 Microsoft.EntityFrameworkCore.Internal.EntityFinder
1.FindTracked(Object[] keyValues, IReadOnlyList1& keyProperties) 在 Microsoft.EntityFrameworkCore.Internal.EntityFinder1.FindAsync(Object[] keyValues, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.FindAsync(Object[] 键值)在 Mcr.PRT.PM.Service.Controllers.ProjectController.GetProjectByProjectCode(字符串 项目代码)在 C:\Users\MaxGay\Source\Repos\PRT2\ProjectManagementService\Controllers\ProjectController.cs:line 98 at lambda_method(Closure, Object) at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult() 在 Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper 映射器,ObjectMethodExecutor 执行器,对象控制器,Object[] 论据)在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker 调用者,ValueTask`1 actionResultValueTask) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker 调用者,任务 lastTask,下一个状态,作用域范围,对象状态,布尔值 已完成)在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed 上下文)在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(状态& next, Scope& 范围, Object& 状态, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|24_0(ResourceInvoker 调用者,任务 lastTask,下一个状态,作用域范围,对象状态,布尔值 已完成)在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed 上下文)在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(状态& next, Scope& 范围, Object& 状态, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用者、任务任务、IDisposable 范围)在 Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(端点 端点,任务 requestTask,ILogger 记录器)在 Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) 在 Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider) 在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文)在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext 上下文)在 Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) 在 Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)标题 ======= Accept: text/plain Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9 Host: localhost Referer: https://localhost/index.html 用户代理:Mozilla/5.0(Windows NT 10.0; WIN64; x64) AppleWebKit/537.36 (KHTML, 像 Gecko) Chrome/85.0.4183.83 Safari/537.36 Edg/85.0.564.41 :method: GET :authority: localhost :方案:https:路径:/api/Project/7000316139.13.01 sec-fetch-site: 同源 sec-fetch-mode: cors sec-fetch-dest: 空
我不确定错误是什么以及为什么会发生?
我尝试将 GetProjectsByProjectCode 切换为公共 IActionResult,但这也无济于事
【问题讨论】:
-
请查看minimal reproducible example 发布代码指南和edit 相应问题。特别是要么删除所有与数据库相关的代码(如果问题是关于 WebAPI 中的路由并将参数传递给操作,这不太可能是基于堆栈跟踪的情况)或更新问题中的代码和文本以询问为什么将字符串传递给方法预计 int 不起作用。
-
这个错误看起来很简单,你的主键是一个 int 但你试图通过字符串查找...
-
@ChiefTwoPencils 是的,这也是我确定的。睡眠不足和沮丧我相信归因于这篇文章
标签: c# asp.net-core-3.1 webapi