在 EF Core 3.0 与 2.2 中执行存储过程
Execute stored procedure in EF Core 3.0 vs 2.2
我正在尝试更新我的代码以适应 EF Core 3.0 中的更改,特别是 ExecuteSqlCommand
的弃用。
以下代码在 2.2 中有效,但如前所述,我需要删除 ExecuteSqlCommand
:
SqlParameter srcid = new SqlParameter("@srcCharacterId", participantApplication.CharacterId);
SqlParameter newid = new SqlParameter("@newCharacterId", newCharacterId);
SqlParameter pResult = new SqlParameter
{
ParameterName = "@pResult",
SqlDbType = System.Data.SqlDbType.Bit,
Direction = System.Data.ParameterDirection.Output
};
_db.Database.ExecuteSqlCommand("pCharacterCopy @srcCharacterId, @newCharacterId, @pResult OUTPUT", srcid, newid, pResult);
我已经尝试将调用更改为 ExecuteSqlRaw
(其他一切都保持不变)但是,尽管它可以编译,但会在 运行 时间抛出以下异常:
The SqlParameterCollection only accepts non-null SqlParameter type objects, not SqlParameter objects
我用调试器检查过 SqlParameter
的 none 为空。我怀疑我对 ExecuteSqlRaw
的调用格式不正确,但除了将调用集成到我不需要的 Linq 查询中之外,我找不到任何示例。我只想触发对存储过程的调用,并在完成后查看输出参数。
这很可能是由于 switch to Microsoft.Data.SqlClient。
删除对 System.Data.SqlClient 程序集的引用并替换命名空间。
using System.Data.SqlClient;
=> using Microsoft.Data.SqlClient;
我正在尝试更新我的代码以适应 EF Core 3.0 中的更改,特别是 ExecuteSqlCommand
的弃用。
以下代码在 2.2 中有效,但如前所述,我需要删除 ExecuteSqlCommand
:
SqlParameter srcid = new SqlParameter("@srcCharacterId", participantApplication.CharacterId);
SqlParameter newid = new SqlParameter("@newCharacterId", newCharacterId);
SqlParameter pResult = new SqlParameter
{
ParameterName = "@pResult",
SqlDbType = System.Data.SqlDbType.Bit,
Direction = System.Data.ParameterDirection.Output
};
_db.Database.ExecuteSqlCommand("pCharacterCopy @srcCharacterId, @newCharacterId, @pResult OUTPUT", srcid, newid, pResult);
我已经尝试将调用更改为 ExecuteSqlRaw
(其他一切都保持不变)但是,尽管它可以编译,但会在 运行 时间抛出以下异常:
The SqlParameterCollection only accepts non-null SqlParameter type objects, not SqlParameter objects
我用调试器检查过 SqlParameter
的 none 为空。我怀疑我对 ExecuteSqlRaw
的调用格式不正确,但除了将调用集成到我不需要的 Linq 查询中之外,我找不到任何示例。我只想触发对存储过程的调用,并在完成后查看输出参数。
这很可能是由于 switch to Microsoft.Data.SqlClient。
删除对 System.Data.SqlClient 程序集的引用并替换命名空间。
using System.Data.SqlClient;
=> using Microsoft.Data.SqlClient;