我遇到了一个很奇怪的错误。我正在控制器中执行一些操作,当我使用 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
。如果需要,我可以复制上下文代码,但它相当大。
谢谢。
这个错误非常简单和愚蠢:有一些触发器指向其他数据库,但我不知道它们在那里,直到我开始逐表检查。我将它们全部禁用并且它起作用了,所以请经常检查这些事情。