EF Core 尝试访问从未添加到项目中的错误数据库

问题描述 投票:0回答:1

我遇到了一个很奇怪的错误。我正在控制器中执行一些操作,当我使用 AJAX 触发其中一项操作时,出现以下错误:

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'.

它似乎试图引用

Saadis_internet
,但我从未添加对该数据库的引用,仅添加到
Saadis
Saadis
Saadis_internet
中都有多个表。

我尝试直接使用连接字符串运行 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 数据库缓存,但没有任何效果。 我尝试复制该项目,并在复制的项目中,使用带有连接字符串的脚手架命令覆盖所有模型和上下文(与我之前直接测试的相同) 没有任何效果,我仍然收到该错误。数据库

Saadis_internet
甚至不再位于我的 SQL Server 实例上,我只有
Saadis
数据库。 这是我正在测试的操作的代码:

[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(); --> HERE IS WHERE THE ERROR TRIGGERS
        // 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;"

正如我之前提到的,项目中的任何地方都没有一行代码引用

Saadis_internet
。如果需要,我可以复制上下文代码,但它相当大。 谢谢。

c# sql-server entity-framework-core
1个回答
0
投票

这个错误非常简单和愚蠢:有一些触发器指向其他数据库,但我不知道它们在那里,直到我开始逐表检查。我将它们全部禁用并且它起作用了,所以请经常检查这些事情。

© www.soinside.com 2019 - 2024. All rights reserved.