尝试 运行 使用带有 EF 的 SqlParameters 插入,出现标量变量错误,如何解决?

Trying to run Insert with SqlParameters with EF, getting scalar variable error, How to fix?

我正在使用 EF 6 MVC5/C#

我正在尝试 运行 插入语句,使用 SqlParameter 对象,通过 ExecuteStoreCommand 通过 EF。我这样做是因为 AddObject.

有一些性能问题

我的代码是:

string insertCmd = "INSERT INTO TABLE (Value,FkId) VALUES (@Value,@FkId)";

var paramList = new[]{
    new SqlParameter("@Value", SqlDbType.VarChar).Value = value,
    new SqlParameter("@FkId", SqlDbType.Int).Value = fkId
};

db.ExecuteStoreCommand(insertCmd, paramList);

我遇到错误:

Must declare the scalar variable "@Value". Statement(s) could not be prepared.

我注意到它总是抱怨 Insert 语句中的第一列,无论类型如何。所以如果我交换它,我会得到:

Must declare the scalar variable "@FkId". Statement(s) could not be prepared.

想法?

编辑:

刚刚注意到记录被插入并保存到数据库中,但我仍然收到此错误。不解...

如果您仔细查看编译器为变量推断的类型:

var paramList = new[]
{
    new SqlParameter("@Value", SqlDbType.VarChar).Value = "SomeValue",
    new SqlParameter("@FkId", SqlDbType.Int).Value = 123
};

您会看到 paramList 是一个具有两个标量值 Value(string)123(int)Object[2],并且 SqlParameters 完全丢失,因为赋值的结果就是赋值! Object 被编译器推断为 stringint.

的最小公分母

不幸的是,调用 ExecuteStoreCommand 不会给你任何警告,表明你没有传递 SqlParameter[],因为它根据文档接受非常弱的类型 params object[]

The parameters value can be an array of DbParameter objects or an array of parameter values

要解决这个问题,您可以使用直接接受值的 SqlParameter 构造函数之一,例如

var paramList = new[]
{
    new SqlParameter("@Value", "SomeValue"),
    new SqlParameter("@FkId", 123)
};

或者创建参数,分配它们,然后添加到数组中。

出于兴趣,ExecuteStoreCommandObjectContext 上的方法,而不是 DbContext。

有一个等效方法 DbContext.Database.ExecuteSqlCommand 应该做同样的事情。