NU1107: Version conflict detected for Microsoft.EntityFrameworkCore.Abstractions. Installing EFCore for use with AspNetCore 2.2

一曲冷凌霜 提交于 2020-12-15 05:23:24

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!