You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;"

排查方向

  1. 检查数据库触发器:登录SQL Server,查看COMPROB或COSTCBT表的触发器,确认是否存在硬编码Saadis_Internet数据库名的逻辑,EF Core保存操作可能触发了此类触发器。
  2. 检查实体配置:确认Comprob和Costcbt实体的Fluent API配置或数据注解,是否错误指定了包含旧数据库名的表限定名(如[Saadis_Internet].[dbo].[COMPROB])。
  3. 检查SQL Server同义词:查看Saadis数据库中是否存在指向Saadis_Internet..COMPROB的同义词,EF Core可能误引用了同义词而非实际表。
  4. 查看EF Core生成的SQL:配置EF Core日志输出,查看SaveChangesAsync()执行时生成的SQL语句,确认是否包含Saadis_Internet的引用,定位问题来源。
  5. 彻底清除缓存:重启SQL Server服务和应用程序池,清除所有可能残留的模型缓存或连接缓存。

内容的提问来源于stack exchange,提问作者Alejo Yanczuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 12:08:14