,.net-core,entity-framework-core,entity-framework-6,.net-4.0"/>

首页 > 解决方案 > 运行 EF6 的问题“SqlQuery()" 在 .NET Core 3.x 的上下文中

问题描述

我有一个利用 Entity Framework 6 的 .NET Framework 4.x 类库。直到最近,它还被用于另一个基于 4.x 的应用程序,但最近它被用于 .NET Core 3.x Azure 函数。类库中没有任何更改,并且大多数方面似乎都按预期工作,但接受SqlParameters 的方法除外,特别是DbContext.Database.SqlQuery<T>().

我遇到的问题似乎与将EF Core 与 .NET Core 3.x 一起使用而不更新 from System.Data.SqlClienttoMicrosoft.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();
    }
}

}

标签: .net-coreentity-framework-coreentity-framework-6.net-4.0

解决方案


推荐阅读