No mapping to a relational type can be found for the CLR type 'Int32[]'
Please update the code
from
_context.Database.ExecuteSqlCommand(
"sp_UpdateProductOrderAndStock @p0, @p1", parameters:
new[]
{
customerProductDelivery.CustomerOrderID,customerProductDelivery.DeliveryQty
});
to
List<SqlParameter> pc = new List<SqlParameter>
{
new SqlParameter("@customerOrderID", customerProductDelivery.CustomerOrderI),
new SqlParameter("@qty", customerProductDelivery.DeliveryQty)
}
_context.Database.ExecuteSqlCommand("sp_UpdateProductOrderAndStock @customerOrderID, @qty", pc.ToArray());
TLDR
Use string interpolation
_context.Database.ExecuteSqlCommand($"Update_ProductOrderAndStock {customerProductDelivery.CustomerOrderID}, {customerProductDelivery.DeliveryQty}");
Detailed answer:
You are falling into a typical params object[]
trap.
First, let see what's the type of the expression
var parameters = new[] { customerProductDelivery.CustomerOrderID,customerProductDelivery.DeliveryQty }
Since both elements are of type int
, the inferred type is int[]
.
Now, there are 2 ExecuteSqlCommand
method overloads which allow you to pass parameters separately - one receiving params object[]
and second receiving IEnumerable<object>
.
Although IEnumerable<T>
is covariant, covariance does not work for value types, so IEnumerable<int>
cannot be treated as IEnumerable<object>
, hence the second overload does not match.
So the only valid overload is the one receiving params object[]
. But since int[]
cannot be cast to object[]
, the compiler treats it as single object
, thus emitting something like new object[] { parameters }
.
The net effect is that the EF method receives single parameter with int[]
type value and generates the exception in question.
With that being said, it could be fixed in many ways.
One is to remove new [] { }
from the call, which is the whole idea of params object[]
construct:
_context.Database.ExecuteSqlCommand(
"Update_ProductOrderAndStock @p0, @p1", customerProductDelivery.CustomerOrderID, customerProductDelivery.DeliveryQty);
Another is to replace the new []
with the explicit new object[]
.
Yet another one is to utilize the EF Core introduced String interpolation in FromSql and ExecuteSqlCommand:
_context.Database.ExecuteSqlCommand(
$"Update_ProductOrderAndStock {customerProductDelivery.CustomerOrderID}, {customerProductDelivery.DeliveryQty}");