ASP.NET Core MVC控制器中SQL查询无法获取ComponentRelation表关联序列号问题排查求助
问题分析与解决方案
嘿,我一眼就发现你遇到的核心问题了——你用了错误的EF Core方法来获取查询结果!ExecuteSqlInterpolated这个方法是用来执行非查询SQL语句的(比如插入、更新、删除数据),它返回的是操作影响的行数,根本不是SELECT语句的查询结果。所以你执行SELECT的时候,它返回-1完全是正常的,因为这个方法本来就不是干这个活的😅。
下面给你两种解决办法,推荐第一种,更贴合EF Core的设计思路:
方法一:用EF Core LINQ查询(推荐)
这种方式不用手写SQL,类型安全,还能避免潜在的SQL注入风险(虽然你的写法是安全的,但LINQ更简洁省心)。
修改你Create方法里的查询逻辑就行:
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create(string fixCodeInput) { // 去掉没用的buildingComponent参数,简化代码 if (ModelState.IsValid) { BuildingComponent bc = new BuildingComponent(); // 要是你在模型里给insertDate设了默认值,这行也可以删掉 bc.insertDate = DateTime.Now; // 用LINQ找匹配的ComponentRelation var matchedRelation = await _context.ComponentRelations .FirstOrDefaultAsync(r => r.FixCode == fixCodeInput); // 注意:这里的FixCode要和你的ComponentRelation模型属性名完全一致,SerialNumber同理 if (matchedRelation != null) { bc.componentSerialNumber = matchedRelation.SerialNumber; _context.Add(bc); await _context.SaveChangesAsync(); // 建议跳转到列表页,而不是停在Create视图,用户体验更好 return RedirectToAction(nameof(Index)); } else { // 找不到对应fixCode时,给用户个提示 ModelState.AddModelError(string.Empty, $"没找到和fixCode {fixCodeInput} 配对的元器件序列号哦"); return View("Create"); } } return View("Create"); }
小优化建议:
- 直接在
BuildingComponent模型里给insertDate设默认值,省得每次在控制器里手动赋值:public DateTime insertDate { get; set; } = DateTime.Now;
方法二:坚持用SQL的话,换个方法获取结果
如果你一定要写原生SQL,可以用ExecuteScalarAsync,它专门用来获取单个查询结果:
// 替换掉原来的ExecuteSqlInterpolated代码 var serialNumber = await _context.Database.ExecuteScalarAsync<string>( $"SELECT serialNumber FROM dbo.componentRelation WHERE fixCode = {fixCodeInput}"); if (!string.IsNullOrEmpty(serialNumber)) { bc.componentSerialNumber = serialNumber; } else { ModelState.AddModelError(string.Empty, $"没找到和fixCode {fixCodeInput} 配对的元器件序列号哦"); return View("Create"); }
注意:ExecuteScalarAsync<T>是EF Core 3.0及以上版本才支持的泛型方法,要是你用的版本更低,就用非泛型的ExecuteScalarAsync然后手动转成字符串就行。
最后别忘了检查这几点
- 确认你的
ComponentRelation模型属性名和数据库表的列名对应上(比如模型里的FixCode对应数据库的fixCode列),要是名字不一样,记得用[Column("fixCode")]这种特性标注。 - 去本地数据库的
componentRelation表里看看,有没有你输入的fixCode数据,别是因为数据库里根本没这条数据才查不到的。 - 调试的时候可以把匹配到的结果打出来看看,方便排查问题:
Console.WriteLine($"匹配到的关系:{System.Text.Json.JsonSerializer.Serialize(matchedRelation)}");
内容的提问来源于stack exchange,提问作者sebiderpilot
相关产品推荐
相关产品推荐

