问题描述
我在控制器中有两个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处的键值类型为“ string”,与 属性类型为“ int”。在 Microsoft.EntityFrameworkCore.Internal.EntityFinder
1.FindTracked(Object[] keyvalues,IReadOnlyList
1&keyProperties)位于 Microsoft.EntityFrameworkCore.Internal.EntityFinder1.FindAsync(Object[] keyvalues,CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Internal.InternalDbSet
1.FindAsync(Object [] 键值) Mcr.PRT.PM.Service.Controllers.ProjectController.GetProjectByProjectCode(String projectCode) C:\ Users \ MaxGay \ Source \ Repos \ PRT2 \ ProjectManagementService \ Controllers \ ProjectController.cs:line 98在lambda_method(Closure,Object)在 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,状态下一个,作用域范围,对象状态,布尔值 isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed 上下文) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& 接下来,范围和范围,对象和状态,布尔值和isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterasync() ---从之前引发异常的位置开始的堆栈跟踪- Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited | 24_0(ResourceInvoker 调用者,任务lastTask,状态下一个,作用域范围,对象状态,布尔值 isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed 上下文) Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& 接下来,范围和范围,对象和状态,布尔值和isCompleted) 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(Endpoint 端点,任务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 上下文)标题 =======接受:文本/纯文本接受编码:gzip,deflate,br接受语言:en-US,en; q = 0.9主机:localhost引用来源: 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:方法:GET:作者:本地主机 :方案:https:路径:/api/Project/7000316139.13.01 sec-fetch-site: 同源sec-fetch-mode:cors sec-fetch-dest:空
我不确定错误是什么,为什么会发生?
我试图将GetProjectsByProjectCode切换为公共IActionResult,但这也没有帮助
解决方法
正如ChiefTwoPencils指出的那样,这里的问题是主键是int,而我正在传递字符串。我想我应该睡点时间