EF Core异常:尝试访问未配置的Saadis_internet数据库问题求助
EF Core 抛出无效对象名 'Saadis_Internet..COMPROB' 异常,但项目仅配置 Saadis 数据库
在控制器通过AJAX触发操作时,EF Core抛出错误提示Invalid object name 'Saadis_Internet..COMPROB',但项目仅配置了Saadis数据库,且Saadis_internet已不存在于SQL Server实例中。直接使用SqlConnection执行SQL查询能正常访问Saadis数据库的COMPROB表,但EF Core执行SaveChangesAsync()时触发异常。
错误信息
fail: Microsoft.EntityFrameworkCore.Update[10000] An exception occurred in the database while saving changes for context type 'App_Escaner.Data.DatabaseContext'. Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while saving the entity changes. See the inner exception for details. ---> Microsoft.Data.SqlClient.SqlException (0x80131904): Invalid object name 'Saadis_Internet..COMPROB'.
正常执行的直接SQL查询代码
using (var connection = new SqlConnection(connectionString)) { connection.Open(); var command = new SqlCommand("SELECT TOP 10 * FROM COMPROB", connection); var reader = command.ExecuteReader(); while (reader.Read()) { Console.WriteLine(reader[0].ToString()); } }
已尝试的解决方案
- 删除重装NuGet包
- 检查连接字符串
- 移除迁移、清理重建项目
- 删除SQL缓存
- 复制项目后用脚手架重新生成模型和上下文
触发异常的控制器代码
[HttpPost] public async Task<IActionResult> DeleteCbtFromHr(string cbt, string hr) { if (string.IsNullOrEmpty(cbt)) return BadRequest("Comprobante no valido."); var fCbt = new GetFormattedCbt().FormatCbt(cbt); try { var comp = await context.Comprobs .Where(x => x.CbtNrocbt == fCbt["nroCbt"] && x.CbtCenemi == fCbt["centEmi"] && x.CbtLetcbt == fCbt["letra"] && x.CbtNrohru == hr ) .FirstOrDefaultAsync(); if (comp == null) return BadRequest("El comprobante no existe."); // Actualizar nrohru, fleter, fleuni y estado del cbt comp.CbtEstado = "1"; comp.CbtNrohru = ""; comp.CbtFleter = ""; comp.CbtFleuni = ""; // Buscar registro de cbt en COSTCBT var costcbt = await context.Costcbt .Where(x => x.Cliente == comp.CbtNrocli && x.CbtCodcbt == comp.CbtCodcbt && x.CbtCenemi == comp.CbtCenemi && x.CbtNrocbt == comp.CbtNrocbt && x.CbtLetcbt == comp.CbtLetcbt) .FirstOrDefaultAsync(); // actualizar importe, impcrr, kilos_afo, bultos, val_decla, hranulada, enviado, plrema if (costcbt != null) { costcbt.Importe = 0; costcbt.CosImpcrr = 0; costcbt.KilosAfo = 0; costcbt.Bultos = 0; costcbt.ValDecla = 0; costcbt.Hranulada = "A"; costcbt.Plrema = 0; } // guardar cambios await context.SaveChangesAsync(); // --> 错误触发点 // Ejecutar store para generar etapa await context.Database.ExecuteSqlRawAsync("EXEC [dbo].[spBorrarComprobHR] @CBT_CENEMI, @CBT_NROCBT, @CBT_LETCBT, @CBT_NROCLI, @CBT_CODCBT, @CBT_NROHRU, @OP", new SqlParameter("@CBT_CENEMI", comp.CbtCenemi), new SqlParameter("@CBT_NROCBT", comp.CbtNrocbt), new SqlParameter("@CBT_LETCBT", comp.CbtLetcbt), new SqlParameter("@CBT_NROCLI", comp.CbtNrocli), new SqlParameter("@CBT_CODCBT", comp.CbtCodcbt), new SqlParameter("@CBT_NROHRU", comp.CbtNrohru), new SqlParameter("@OP", HttpContext.Session.GetString("Operador")) ); // devolver vista return PartialView("_CbtDeleteResult"); } catch (Exception ex) { return BadRequest(ex.Message); } }
项目连接字符串
"default": "Server=localhost\\SQLDEV; Database=Saadis; Integrated Security=False;user=*;pwd=*; TrustServerCertificate=True;"
排查方向
- 检查数据库触发器:登录SQL Server,查看COMPROB或COSTCBT表的触发器,确认是否存在硬编码
Saadis_Internet数据库名的逻辑,EF Core保存操作可能触发了此类触发器。 - 检查实体配置:确认
Comprob和Costcbt实体的Fluent API配置或数据注解,是否错误指定了包含旧数据库名的表限定名(如[Saadis_Internet].[dbo].[COMPROB])。 - 检查SQL Server同义词:查看Saadis数据库中是否存在指向
Saadis_Internet..COMPROB的同义词,EF Core可能误引用了同义词而非实际表。 - 查看EF Core生成的SQL:配置EF Core日志输出,查看
SaveChangesAsync()执行时生成的SQL语句,确认是否包含Saadis_Internet的引用,定位问题来源。 - 彻底清除缓存:重启SQL Server服务和应用程序池,清除所有可能残留的模型缓存或连接缓存。
内容的提问来源于stack exchange,提问作者Alejo Yanczuk
相关产品推荐
相关产品推荐

