.net-core - 运行 EF6 的问题“SqlQuery()" 在 .NET Core 3.x 的上下文中
问题描述
我有一个利用 Entity Framework 6 的 .NET Framework 4.x 类库。直到最近,它还被用于另一个基于 4.x 的应用程序,但最近它被用于 .NET Core 3.x Azure 函数。类库中没有任何更改,并且大多数方面似乎都按预期工作,但接受SqlParameter
s 的方法除外,特别是DbContext.Database.SqlQuery<T>()
.
我遇到的问题似乎与将EF Core 与 .NET Core 3.x 一起使用而不更新 from System.Data.SqlClient
toMicrosoft.Data.SqlClient
时发生的问题非常相似,只是它颠覆了这个问题。异常消息是:
The SqlParameterCollection only accepts non-null SqlParameter type objects, not SqlParameter objects.
但是,我遇到的所有文档都指出 EF 6与.NET Core 3.x 兼容,但与 .NET Core 3.x不兼容Microsoft.Data.SqlClient
。我肯定在使用System.Data.SqlClient.SqlParameter
,但我看不到应用程序进入的任何地方Microsoft.Data.SqlClient
,如以下部分堆栈跟踪所示:
at System.Data.SqlClient.SqlParameterCollection.ValidateType(Object value)
at System.Data.SqlClient.SqlParameterCollection.AddRange(Array values)
at System.Data.Entity.Core.Objects.ObjectContext.CreateStoreCommand(String commandText, Object[] parameters)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryInternal[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass186_0`1.<ExecuteStoreQueryReliably>b__1()
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass186_0`1.<ExecuteStoreQueryReliably>b__0()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryReliably[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQuery[TElement](String commandText, ExecutionOptions executionOptions, Object[] parameters)
at System.Data.Entity.Internal.InternalContext.<>c__DisplayClass111_0`1.<ExecuteSqlQuery>b__0()
at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
<<a bunch of our custom stuff>>
at Microsoft.Azure.WebJobs.Host.Executors.VoidMethodInvoker`2.InvokeAsync(TReflected instance, Object[] arguments) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\VoidMethodInvoker.cs:line 21
at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`2.<InvokeAsync>d__10.MoveNext() in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionInvoker.cs:line 52
编辑:这是解决方案中的精简代码......
在 .NetCore 3.1 函数 (v3) 中:
使用 Microsoft.Azure.ServiceBus;使用 Microsoft.Azure.WebJobs;使用 Microsoft.Extensions.Logging;使用 MyProject.Services;
命名空间 MyProject.Functions { public class MyFunction { private readonly MyDbContext _ctx;
public MyFunction(MyDbContext ctx)
{
_ctx = ctx;
}
[FunctionName("MyFunction")]
public override void Run([ServiceBusTrigger("%QueueName%", Connection = "%ConnectionString%")]
Message msg,
ILogger log)
{
var service = new MyService();
service.DoStuff();
}
}
}
在 .NET 4.8 类库中:
使用 System.Collections.Generic;使用 System.Data.SqlClient;使用 System.Linq;
命名空间 MyProject.Services { public class MyService { private readonly MyDbContext _context;
public MyService(MyDbContext ctx)
{
_context = ctx;
}
public void DoStuff()
{
//this works
var lineItems1 = _context.LineItems.Where(li => li.Description == "something arbitrary").ToList();
//this gives the exception and stack trace from the original post
var lineItems2 = _context.Database.SqlQuery<LineItem>(
"SELECT * FROM LineItems WHERE Description = @Description",
new[] { new SqlParameter("@Description", "something arbitrary") }).ToList();
}
}
}
解决方案
推荐阅读
- python - Numpy arcsinh np.arcsinh() 转换函数的比例参数
- botframework - Oauth 登录不起作用,显示:['application/vnd.microsoft.card.oauth' 类型的文件]
- ruby-on-rails - 关系数据库和外键
- git - 我的项目文件没有被推送到 GitHub 存储库
- javascript - 将项目添加到收藏夹并将其保存在 Cookie 中
- teradata - 有没有办法在 Teradata 中对每个事件记录的事件进行排名(按行排名,而不是按列排名)?
- android-studio - 在 Android 中导入 Watson JAVA SDK 时出现问题
- javascript - 为什么我不能在 Chrome Devtools 中使用 React Native 扩展 console.logged 对象?
- android - Charles + Android + Chrome + SSL - 握手失败(certificate_unknown)
- ruby-on-rails - 在单击 button_tag 时验证 text_field_tag(没有 form_for)