Если вы внимательно посмотрите на тип, выведенный компилятором для переменной:
var paramList = new[]
{
new SqlParameter("@Value", SqlDbType.VarChar).Value = "SomeValue",
new SqlParameter("@FkId", SqlDbType.Int).Value = 123
};
Вы увидите, что paramList
- это Object[2]
с двумя скалярными значениями Value(string)
и 123(int)
, а SqlParameters
полностью потеряны, потому что результатом присваивания является присвоенное значение! Object
выводится компилятором как наименьший общий знаменатель из string
и int
.
К сожалению, вызов ExecuteStoreCommand
не даст вам никакого предупреждения о том, что вы не передаете SqlParameter[]
, поскольку он принимает очень слабый тип params object[]
согласно документам:
Значением параметров может быть массив объектов DbParameter или массив значений параметров
Чтобы решить эту проблему, вы можете использовать один из конструкторов SqlParameter
, которые непосредственно принимают значение, например,
var paramList = new[]
{
new SqlParameter("@Value", "SomeValue"),
new SqlParameter("@FkId", 123)
};
Или создайте параметры, назначьте их и добавьте в массив.
Из интереса, ExecuteStoreCommand
- это метод для ObjectContext
, а не DbContext.
Существует эквивалентный метод DbContext.Database.ExecuteSqlCommand
, который должен делать то же самое.