C# 从EFCore执行SQL Server存储过程时出现问题

C# 从EFCore执行SQL Server存储过程时出现问题,c#,sql-server,stored-procedures,.net-core,entity-framework-core,C#,Sql Server,Stored Procedures,.net Core,Entity Framework Core,我有一个包含多个表的数据库,我准备了一个存储过程(基本上由delete*from…语句组成)来删除这些表中的行。当我从SQLServerManagementStudio运行存储过程时,它运行得很好。 现在,我想从我的C#应用程序执行相同的存储过程。我使用以下代码执行此操作: using (var context = new DBContext()) { var param = new SqlParameter[] {...}; //create parameters here /

我有一个包含多个表的数据库,我准备了一个存储过程(基本上由delete*from…语句组成)来删除这些表中的行。当我从SQLServerManagementStudio运行存储过程时,它运行得很好。 现在,我想从我的C#应用程序执行相同的存储过程。我使用以下代码执行此操作:

using (var context = new DBContext())
{
    var param = new SqlParameter[] {...}; //create parameters here
    //trigger the stored procedure for deletion from the first table here
    context.Database.ExecuteSqlRaw("[dbo].[delete_first] @id,@date", param);
                        
    //trigger the stored procedure for deletion from the hts_clients table here
    context.Database.ExecuteSqlRaw("[dbo].[delete_second] @id,@date", param);
}
执行时,第一次调用似乎工作正常。但是,第二个始终抛出异常,并显示以下消息:

EXECUTE后的事务计数表示BEGIN和COMMIT语句的数量不匹配。上一次计数=0,当前计数=1。EXECUTE后的事务计数表示BEGIN和COMMIT语句的数量不匹配。上一次计数=0,当前计数=1

(注意:是的,异常消息与此完全相同。我没有粘贴两次。)

但是,我肯定没有在存储过程的主体中使用任何事务,也就是说,它们中的任何一个都没有Begin Transaction/Commit Transaction/Rollback transactions语句,也没有将调用封装在来自EFCore的事务中(从上面的代码段可以看出)。谁能告诉我为什么会这样?
提前感谢。

在executeSql之后,dbContext不会自动刷新。您必须重新加载已更改的条目

尝试使用以下方法:

 context.Database.ExecuteSqlRaw("[dbo].[delete_first] @id,@date", param);
  _context.Entry(...deletionClass...  ).Reload();
 
    context.Database.ExecuteSqlRaw("[dbo].[delete_second] @id,@date", param);

//and maybe if you need  you can try it again
 _context.Entry(...deletionClass...  ).Reload();

但是在您的情况下,为第二个存储过程创建新的DbContext可能更容易

using (var context1 = new DBContext())
{
    var param = new SqlParameter[] {...}; //create parameters here
    //trigger the stored procedure for deletion from the first table here
    context1.Database.ExecuteSqlRaw("[dbo].[delete_first] @id,@date", param);
 }
 using (var context2 = new DBContext())
{
var param = new SqlParameter[] {...}; //create parameters here                      
    //trigger the stored procedure for deletion from the hts_clients table here
    context2.Database.ExecuteSqlRaw("[dbo].[delete_second] @id,@date", param);
}



其中大多数ORM和EF都在内部使用事务。遗憾的是,我对错误一无所知。可能在第二次调用时使用了不同的参数集?您是否尝试使用相同的参数手动执行sp?它可能会抛出错误。您的sp是否有try/catch块?表上是否有触发器?也许试着只从应用程序执行第一个,然后让第一个proc exec执行第二个…?一定是存储过程中的某个东西。EF甚至没有在这里启动事务。