Asp.net mvc 实体框架3.1中的ExecuteSqlRawAsync返回-1

Asp.net mvc 实体框架3.1中的ExecuteSqlRawAsync返回-1,asp.net-mvc,asp.net-core,entity-framework-core,Asp.net Mvc,Asp.net Core,Entity Framework Core,在我的ASP.NET Core 3.1 web应用程序中,我主要使用存储过程。在实体框架核心中使用ExecuteSqlRawAsync时,它总是返回-1。下面给出了我执行存储过程的通用方法 public async Task<int> ExecuteSqlNonQuery(string StoredProcName, params object[] parameters) { int iTotalRecordsAffected = 0; Li

在我的ASP.NET Core 3.1 web应用程序中,我主要使用存储过程。在实体框架核心中使用
ExecuteSqlRawAsync
时,它总是返回
-1
。下面给出了我执行存储过程的通用方法

  public async Task<int> ExecuteSqlNonQuery(string StoredProcName, params object[] parameters)
  {
        int iTotalRecordsAffected = 0;

        List<TEntity> listOfObject = null;

        try
        {
            if (!string.IsNullOrEmpty(StoredProcName))
            {
                StringBuilder sbStoredProc = new StringBuilder();
                sbStoredProc.Append("Exec ");
                sbStoredProc.Append(StoredProcName);

                if (parameters != null)
                {
                    foreach (SqlParameter item in parameters)
                    {
                        if (listOfObject == null)
                        {
                            sbStoredProc.Append(" @");
                            listOfObject = new List<TEntity>();
                        }
                        else
                        {
                            sbStoredProc.Append(", @");
                        }
                        sbStoredProc.Append(item.ParameterName.Replace("@", ""));
                        if (item.Direction == System.Data.ParameterDirection.Output)
                        {
                            sbStoredProc.Append(" OUT");
                        }
                    }
                }

                iTotalRecordsAffected = await _DBContext.Database.ExecuteSqlRawAsync(sbStoredProc.ToString(), parameters);
            }
        }
        catch (Exception ex)
        {

        }
        finally
        {
            if (_DBContext.Database.GetDbConnection().State == System.Data.ConnectionState.Open)
            {
                _DBContext.Database.GetDbConnection().Close();
            }
        }

        return iTotalRecordsAffected;
 }
public async Task ExecuteSqlNonQuery(string StoredProcName,params object[]parameters)
{
int-iTotalRecordsAffected=0;
List ListoObject=null;
尝试
{
如果(!string.IsNullOrEmpty(StoredProcName))
{
StringBuilder sbStoredProc=新StringBuilder();
sbStoredProc.追加(“执行”);
sbStoredProc.Append(StoredProcName);
if(参数!=null)
{
foreach(参数中的SqlParameter项)
{
if(listOfObject==null)
{
sbStoredProc.追加(“@”);
ListoObject=新列表();
}
其他的
{
sbStoredProc.追加(“,@”);
}
sbStoredProc.Append(item.ParameterName.Replace(“@”和“”);
if(item.Direction==System.Data.ParameterDirection.Output)
{
sbStoredProc.追加(“输出”);
}
}
}
iTotalRecordsAffected=await _DBContext.Database.ExecuteSqlRawAsync(sbStoredProc.ToString(),参数);
}
}
捕获(例外情况除外)
{
}
最后
{
if(_DBContext.Database.GetDbConnection().State==System.Data.ConnectionState.Open)
{
_DBContext.Database.GetDbConnection().Close();
}
}
返回受影响的iTotalRecords;
}
这是我的控制器方法,它调用SP来更新数据

   public async Task<int> UpdateCustomerData(EditCustomerDetail editCustomerDetail)
    {
        int iTotalRecordsEffected = 0;

        try
        {
            List<SqlParameter> sqlParamList = new List<SqlParameter>()
            {
                new SqlParameter("@CustomerID",editCustomerDetail.CorporateID),
                new SqlParameter("@CustomerName",editCustomerDetail.CorporateName),
                new SqlParameter("@CustomerAddress",editCustomerDetail.Address),
                new SqlParameter("@City",editCustomerDetail.City),
                new SqlParameter("@CountryID",editCustomerDetail.CountryID),
                new SqlParameter("@StateID",editCustomerDetail.StateID),
                new SqlParameter("@Description",editCustomerDetail.Description),
                new SqlParameter("@Phone",editCustomerDetail.Phone),
                new SqlParameter("@Fax",editCustomerDetail.Fax),
                new SqlParameter("@ModifiedBy",editCustomerDetail.UserID)
            };

            iTotalRecordsEffected = await _unitOfWork.GetRepository<EditCustomerDetail>().ExecuteSqlNonQuery("UpdateCustomerDetails", sqlParamList.ToArray());
        }
        catch (Exception ex)
        {

        }
        finally
        {

        }
        return iTotalRecordsEffected;
    }
public异步任务UpdateCustomerData(EditCustomerDetail EditCustomerDetail)
{
int iTotalRecordsEffected=0;
尝试
{
List sqlParamList=新列表()
{
新的SqlParameter(“@CustomerID”,editCustomerDetail.CorporateID),
新的SqlParameter(“@CustomerName”,editCustomerDetail.CorporateName),
新的SqlParameter(“@CustomerAddress”,editCustomerDetail.Address),
新的SqlParameter(“@City”,editCustomerDetail.City),
新的SqlParameter(“@CountryID”,editCustomerDetail.CountryID),
新的SqlParameter(“@StateID”,editCustomerDetail.StateID),
新的SqlParameter(“@Description”,editCustomerDetail.Description),
新的SqlParameter(“@Phone”,editCustomerDetail.Phone),
新的SqlParameter(“@Fax”,editCustomerDetail.Fax),
新的SqlParameter(“@ModifiedBy”,editCustomerDetail.UserID)
};
iTotalRecordsEffected=wait_unitOfWork.GetRepository().ExecuteSqlNonQuery(“UpdateCustomerDetails”,sqlParamList.ToArray());
}
捕获(例外情况除外)
{
}
最后
{
}
返回iTotalRecordsEffected;
}

有没有任何关于我做错了什么的建议?

这似乎是ADO.NET的标准行为。EF Core表示这种情况只是一个中间变量。@IvanStoev我发现了问题:-在连接上设置SET NOCOUNT ON时,受单个语句影响的行停止参与此方法返回的受影响行的计数。这解决了我的问题。