找不到CLR类型'SqlParameter'到关系类型的映射

时间:2019-05-15 09:12:04

标签: c# ef-core-2.2

当尝试在EntityFrameworkCore(2.2)上执行带有命名参数的SQL请求时,出现以下异常:

  

InvalidOperationException:找不到CLR类型'SqlParameter'到关系类型的映射。

我尝试过但可以令人满意的:

  • 原始SQL请求: 可行但不安全

  • 命名参数: 也可以,但不太明确的imo

await context.Database.ExecuteSqlCommandAsync(
                    "UPDATE dbo.Table SET ActivationDate = @p0, SubscriptionEndTime = @p1 WHERE SerialNumber IN (@p2) AND UserId = @p3;",
                    DateTime.UtcNow,
                    DateTime.UtcNow.AddYears(1),
                    string.Join("','", eqs.Select(e => e.SerialNumber)),
                    user.Id);

什么不起作用:

  • 传递SqlParameters或对象数组

这是我的代码:

await context.Database.ExecuteSqlCommandAsync(
                    "UPDATE dbo.Table SET ActivationDate = @actDate, SubscriptionEndTime = @endDate WHERE SerialNumber IN (@serials) AND UserId = @userId;",
                    new SqlParameter("@actDate", DateTime.UtcNow),
                    new SqlParameter("@endDate", DateTime.UtcNow.AddYears(1)),
                    new SqlParameter("@serials", string.Join("','", eqs.Select(e => e.SerialNumber))),
                    new SqlParameter("@userId", user.Id));

我不明白为什么它不起作用,因为根据文档(link):

  

这允许您在SQL查询字符串中使用命名参数。 context.Database.ExecuteSqlCommandAsync(“ UPDATE dbo.Posts SET Rating = 5 WHERE Author = @author”,new SqlParameter(“ @ author”,userSuppliedAuthor));

那么如何在请求中使用命名参数?

编辑:

我认为问题不在于请求本身。 以下结果导致完全相同的异常:

await context.Database.ExecuteSqlCommandAsync(
                    "UPDATE dbo.Table SET Name = @name WHERE SerialNumber = 'XXXX'",
                    new SqlParameter("@name", "testing"));

1 个答案:

答案 0 :(得分:0)

找到我的解决方案...

导入的SqlParameter来自命名空间:

  

Microsoft.Azure.Documents.SqlParameter

正确的是:

  

System.Data.SqlClient.SqlParameter