问题
I was able to upgrade my .NetStandard2.0 project to use EntityFrameworkCore 3.1.4 and created a nuget package.
Now I want to use that nuget package in my netcoreapp2.2 project.
However, when I try to add the package via nuget I get
Error NU1107 Version conflict detected for Microsoft.EntityFrameworkCore. Install/reference Microsoft.EntityFrameworkCore 3.1.4 directly to project MyApi to resolve this issue.
MyApi -> SBDSTD.Standard 1.0.0-CI-20200526-230146 -> Microsoft.EntityFrameworkCore (>= 3.1.4)
MyApi -> Microsoft.AspNetCore.App 2.2.0 -> Microsoft.EntityFrameworkCore (>= 2.2.0 && < 2.3.0). MyApi D:\dev\MyApi\MyApi\MyApi.csproj 1
So I tried to install the Entity Framework Packages using
Install-Package Microsoft.EntityFrameworkCore -Version 3.1.4
I got
NU1608: Detected package version outside of dependency constraint: Microsoft.AspNetCore.App 2.2.0 requires Microsoft.EntityFrameworkCore (>= 2.2.0 && < 2.3.0) but version Microsoft.EntityFrameworkCore 3.1.4 was resolved.
Install-Package : NU1107: Version conflict detected for Microsoft.EntityFrameworkCore.Abstractions. Install/reference Microsoft.EntityFrameworkCore.Abstractions 3.1.4 directly to project
MyApito resolve this issue.
MyApi-> Microsoft.EntityFrameworkCore 3.1.4 -> Microsoft.EntityFrameworkCore.Abstractions (>= 3.1.4)
MyApi-> Microsoft.AspNetCore.App 2.2.0 -> Microsoft.EntityFrameworkCore.Abstractions (>= 2.2.0 && < 2.3.0).
At line:1 char:1
+ Install-Package Microsoft.EntityFrameworkCore -Version 3.1.4
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Install-Package], Exception
+ FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand
I aren't willing to start trying to install the suggested package because I have just lost half a day doing similar things in the Package Manager UI [Update] When I do start to install via Nuget I see a message
Detected package version outside of dependency constraint: Microsoft.EntityFrameworkCore.Abstractions (>=2.2.0 && < 2.3.0) but version Microsoft.EntityFrameworkCore.Abstractions 3.1.5 was resolved
If I roll back my library to using EntityFrameworkCore 2.2.0 and had to change all Microsoft.Data.SqlClient to System.Data.SqlClient references.
[Update] Following Lauxjpn's advice and pasting in the references I get
I started to try and resolve errors. The first error I got was on
using Remotion.Linq.Clauses;
which I simply commented out.
Then I got as far as
CS0619 'RelationalQueryableExtensions.FromSql<TEntity>(IQueryable<TEntity>, RawSqlString, params object[])' is obsolete: 'For returning objects from SQL queries using plain strings, use FromSqlRaw instead. For returning objects from SQL queries using interpolated string syntax to create parameters, use FromSqlInterpolated instead. Call either new method directly on the DbSet at the root of the query
回答1:
The underlying issue is, that the Microsoft.AspNetCore.App
meta package is referencing a specific version range for the EF Core (and other) packages.
[...] Install/reference Microsoft.EntityFrameworkCore 3.1.4 directly to project MyApi to resolve this issue.
A simple solution is to do, what the message tells you to: Explicitly add the package versions, that you want to override, to the target project.
Assuming a simple original project file the the following:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
</ItemGroup>
</Project>
Then the following will make your project compile:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
</ItemGroup>
<!-- Manually override all conflicting packages we care about and their
dependencies, that are referenced by `Microsoft.AspNetCore.App`. -->
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.Options" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.Primitives" Version="3.1.4" />
</ItemGroup>
</Project>
However, this will lead to a couple of warnings. If you don't want these, you have to reference the individual packages, that the Microsoft.AspNetCore.App
meta package conveniently combines for you, and update their versions appropriately:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
<ItemGroup>
<!-- Don't use the meta package anymore. We will explicitly reference
all actual packages instead.-->
<!--<PackageReference Include="Microsoft.AspNetCore.App" />-->
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
</ItemGroup>
<!-- Manually include all packages from "Microsoft.AspNetCore.App",
and update all package versions unrelated to ASP.NET Core. -->
<ItemGroup>
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.6"/>
<PackageReference Include="Microsoft.AspNetCore.Antiforgery" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.Abstractions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.Core" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.Facebook" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.Google" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.OAuth" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.Twitter" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.WsFederation" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authorization.Policy" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Authorization" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.CookiePolicy" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Cors" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Cryptography.Internal" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.DataProtection.Abstractions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.DataProtection.Extensions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.DataProtection" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.Abstractions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.HealthChecks" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.HostFiltering" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Hosting.Server.Abstractions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Html.Abstractions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Http.Connections.Common" Version="1.1.0"/>
<PackageReference Include="Microsoft.AspNetCore.Http.Connections" Version="1.1.0"/>
<PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.HttpOverrides" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.HttpsPolicy" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Localization.Routing" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Localization" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.MiddlewareAnalysis" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Analyzers" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.ApiExplorer" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Cors" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.DataAnnotations" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Localization" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.RazorPages" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.TagHelpers" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.NodeServices" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Owin" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Razor.Runtime" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Razor" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.ResponseCaching.Abstractions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.ResponseCaching" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Rewrite" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Routing.Abstractions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Routing" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Server.HttpSys" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Server.IIS" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Core" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Https" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.Session" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="1.1.0"/>
<PackageReference Include="Microsoft.AspNetCore.SignalR.Core" Version="1.1.0"/>
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="1.1.0"/>
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0"/>
<PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.WebSockets" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0"/>
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0"/>
<PackageReference Include="Microsoft.CodeAnalysis.Razor" Version="2.2.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.4"/>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Caching.SqlServer" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Configuration.Xml" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.DiagnosticAdapter" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.FileProviders.Abstractions" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.FileProviders.Composite" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.FileSystemGlobbing" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Http" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Identity.Core" Version="2.2.0"/>
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="2.2.0"/>
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Localization" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Logging.EventSource" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Logging.TraceSource" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.ObjectPool" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Options" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.Primitives" Version="3.1.4"/>
<PackageReference Include="Microsoft.Extensions.WebEncoders" Version="3.1.4"/>
<PackageReference Include="Microsoft.Net.Http.Headers" Version="2.2.0"/>
<PackageReference Include="System.IO.Pipelines" Version="4.5.2"/>
</ItemGroup>
</Project>
Update:
For the issues that now occur after the reference issues have been resolved, these are now issues related to your upgrade from EF Core 2.2. to 3.1.4.
(Technically this is now a completely different question with a completely different answer and unrelated to your original question. I would therefore recommend to ask an entirely new question on SO for this next time.)
There were many significant breaking changes in EF Core 3.0, because the query pipeline was completely rewritten.
One of those changes is, that EF Core does not rely on Remotion
anymore.
As for your ExecuteSqlQuery()
extension method, the following implementation should work:
public static class DatabaseFacadeExtensions
{
public static RelationalDataReader ExecuteSqlQuery(
this DatabaseFacade databaseFacade,
string sql,
params object[] parameters)
{
var concurrencyDetector = databaseFacade.GetService<IConcurrencyDetector>();
using (concurrencyDetector.EnterCriticalSection())
{
var rawSqlCommand = databaseFacade
.GetService<IRawSqlCommandBuilder>()
.Build(sql, parameters);
var connection = databaseFacade.GetService<IRelationalConnection>();
var parameterObj = new RelationalCommandParameterObject(
connection,
rawSqlCommand.ParameterValues,
null,
null,
null);
return rawSqlCommand.RelationalCommand.ExecuteReader(parameterObj);
}
}
}
CS0619 'RelationalQueryableExtensions.FromSql(IQueryable, RawSqlString, params object[])' is obsolete: 'For returning objects from SQL queries using plain strings, use FromSqlRaw instead. For returning objects from SQL queries using interpolated string syntax to create parameters, use FromSqlInterpolated instead. Call either new method directly on the DbSet at the root of the query
For the warning above, it already tells you what to do (use either FromSqlRaw
or FromSqlInterpolated
instead). It is also an EF Core change in 3.0. See Raw SQL Queries for further information.
Here is a fully working console sample, that demonstrates both functionalities (your ExecuteSqlQuery()
extension method and FromSqlInterpolated()
):
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.Extensions.Logging;
namespace IssueConsoleTemplate
{
public class IceCream
{
public int IceCreamId { get; set; }
public string Name { get; set; }
}
public static class DatabaseFacadeExtensions
{
public static RelationalDataReader ExecuteSqlQuery(
this DatabaseFacade databaseFacade,
string sql,
params object[] parameters)
{
var concurrencyDetector = databaseFacade.GetService<IConcurrencyDetector>();
using (concurrencyDetector.EnterCriticalSection())
{
var rawSqlCommand = databaseFacade
.GetService<IRawSqlCommandBuilder>()
.Build(sql, parameters);
var connection = databaseFacade.GetService<IRelationalConnection>();
var parameterObj = new RelationalCommandParameterObject(
connection,
rawSqlCommand.ParameterValues,
null,
null,
null);
return rawSqlCommand.RelationalCommand.ExecuteReader(parameterObj);
}
}
}
public class Context : DbContext
{
public DbSet<IceCream> IceCreams { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer(@"Data Source=.\MSSQL14;Integrated Security=SSPI;Initial Catalog=So63009531")
.UseLoggerFactory(
LoggerFactory.Create(
b => b
.AddConsole()
.AddFilter(level => level >= LogLevel.Information)))
.EnableSensitiveDataLogging()
.EnableDetailedErrors();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<IceCream>()
.HasData(
new IceCream {IceCreamId = 1, Name = "Vanilla"},
new IceCream {IceCreamId = 2, Name = "Chocolate"});
}
}
internal static class Program
{
private static void Main()
{
using var context = new Context();
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
var iceCreams = context.IceCreams
.OrderBy(u => u.IceCreamId)
.ToList();
var vanillaName = "Vanilla";
var vanillaIceCreamCountReader = context.Database.ExecuteSqlQuery(
@"select count(*) as [IceCreamCount]
from [dbo].[IceCreams]
where Name = @p0;",
vanillaName);
vanillaIceCreamCountReader.Read();
var vanillaIceCreamCount = (int)vanillaIceCreamCountReader.DbDataReader["IceCreamCount"];
vanillaIceCreamCountReader.Dispose();
var chocolateName = "Chocolate";
var chocolateIceCreams = context.IceCreams
.FromSqlInterpolated($"select * from [dbo].[IceCreams] where [Name] = {chocolateName}")
.ToList();
Debug.Assert(iceCreams.Count == 2);
Debug.Assert(vanillaIceCreamCount == 1);
Debug.Assert(chocolateIceCreams.Count == 1);
}
}
}
Please be aware, that because of the significant query pipeline changes in EF Core 3.0, your queries might perform different than before (the keyword is cartesian explosion).
来源:https://stackoverflow.com/questions/62034467/nu1107-version-conflict-detected-for-microsoft-entityframeworkcore-abstractions