Stored procedures 另一种说法是:“;SqlParameter已包含在另一个SqlParameterCollection“中;问题

Stored procedures 另一种说法是:“;SqlParameter已包含在另一个SqlParameterCollection“中;问题,stored-procedures,.net-core,entity-framework-6,Stored Procedures,.net Core,Entity Framework 6,当我的核心3.1/EF 6.4.4应用程序启动时,我调用以下(EF工具生成的)代码: public async Task<cp_Upsert_ScheduledTasksTrackingResult[]> cp_Upsert_ScheduledTasksTrackingAsync(int? scheduledTasksTrackingID, string taskName, int? recordsAffected, bool? successResult, DateTime

当我的核心3.1/EF 6.4.4应用程序启动时,我调用以下(EF工具生成的)代码:

    public async Task<cp_Upsert_ScheduledTasksTrackingResult[]> cp_Upsert_ScheduledTasksTrackingAsync(int? scheduledTasksTrackingID, string taskName, int? recordsAffected, bool? successResult, DateTime? processStart, DateTime? processStop, string resultNote, OutputParameter<int> returnValue = null, CancellationToken cancellationToken = default)
    {
        var parameterreturnValue = new SqlParameter
        {
            ParameterName = "returnValue",
            Direction = System.Data.ParameterDirection.Output,
            SqlDbType = System.Data.SqlDbType.Int,
        };

        var sqlParameters = new []
        {
            new SqlParameter
            {
                ParameterName = "scheduledTasksTrackingID",
                Value = scheduledTasksTrackingID ?? Convert.DBNull,
                SqlDbType = System.Data.SqlDbType.Int,
            },
            new SqlParameter
            {
                ParameterName = "taskName",
                Size = 200,
                Value = taskName ?? Convert.DBNull,
                SqlDbType = System.Data.SqlDbType.VarChar,
            },
            new SqlParameter
            {
                ParameterName = "recordsAffected",
                Value = recordsAffected ?? Convert.DBNull,
                SqlDbType = System.Data.SqlDbType.Int,
            },
            new SqlParameter
            {
                ParameterName = "successResult",
                Value = successResult ?? Convert.DBNull,
                SqlDbType = System.Data.SqlDbType.Bit,
            },
            new SqlParameter
            {
                ParameterName = "processStart",
                Value = processStart ?? Convert.DBNull,
                SqlDbType = System.Data.SqlDbType.DateTime,
            },
            new SqlParameter
            {
                ParameterName = "processStop",
                Value = processStop ?? Convert.DBNull,
                SqlDbType = System.Data.SqlDbType.DateTime,
            },
            new SqlParameter
            {
                ParameterName = "resultNote",
                Size = -1,
                Value = resultNote ?? Convert.DBNull,
                SqlDbType = System.Data.SqlDbType.VarChar,
            },
            parameterreturnValue,
        };
        var _ = await _context.SqlQueryAsync<cp_Upsert_ScheduledTasksTrackingResult>("EXEC @returnValue = [dbo].[cp_Upsert_ScheduledTasksTracking] @scheduledTasksTrackingID, @taskName, @recordsAffected, @successResult, @processStart, @processStop, @resultNote", sqlParameters, cancellationToken);

        returnValue?.SetValue(parameterreturnValue.Value);

        return _;
    }
public async Task cp\u Upsert\u ScheduledTasksTrackingAsync(int?scheduledTasksTrackingID,string taskName,int?recordsafected,bool?successResult,DateTime?processStart,DateTime?processStop,string resultNote,OutputParameter returnValue=null,CancellationToken CancellationToken=default)
{
var parameterreturnValue=新的SqlParameter
{
ParameterName=“returnValue”,
方向=System.Data.ParameterDirection.Output,
SqlDbType=System.Data.SqlDbType.Int,
};
var sqlParameters=new[]
{
新的SqlParameter
{
ParameterName=“ScheduledTaskTrackingId”,
值=ScheduledTaskTrackingId??Convert.DBNull,
SqlDbType=System.Data.SqlDbType.Int,
},
新的SqlParameter
{
ParameterName=“taskName”,
尺寸=200,
Value=taskName??Convert.DBNull,
SqlDbType=System.Data.SqlDbType.VarChar,
},
新的SqlParameter
{
ParameterName=“recordsAffected”,
值=recordsAffected??Convert.DBNull,
SqlDbType=System.Data.SqlDbType.Int,
},
新的SqlParameter
{
ParameterName=“successResult”,
Value=successResult??Convert.DBNull,
SqlDbType=System.Data.SqlDbType.Bit,
},
新的SqlParameter
{
ParameterName=“processStart”,
Value=processStart??Convert.DBNull,
SqlDbType=System.Data.SqlDbType.DateTime,
},
新的SqlParameter
{
ParameterName=“processStop”,
Value=processStop??Convert.DBNull,
SqlDbType=System.Data.SqlDbType.DateTime,
},
新的SqlParameter
{
ParameterName=“resultNote”,
大小=-1,
Value=resultNote??Convert.DBNull,
SqlDbType=System.Data.SqlDbType.VarChar,
},
parameterreturnValue,
};
var\uu=wait\u context.SqlQueryAsync(“EXEC@returnValue=[dbo].[cp\u Upsert\u ScheduledTasksTracking]@scheduledTasksTrackingID、@taskName、@recordsafected、@successResult、@processStart、@processStop、@resultNote”、sqlParameters、cancellationToken);
returnValue?.SetValue(parameterreturnValue.Value);
返回;;
}
正如您所看到的,这个方法的sqlParameters应该在本地作用于这个方法,因此,这个方法应该可以毫无问题地调用(或者我是这么认为的)。我已经用这段代码成功地通过了几十次测试和(dev、sit和stg)部署,但它只在生产中失败了(第一次调用)! 我这样称呼它:

_=\u CustomAppsProceduresContext.cp\u Upsert\u ScheduledTaskTrackingAsync(-1,\u ThisAppName,0,false,DateTime.Now,null,null)。Result.FirstOrDefault()

有没有更好(更可靠)的方法