【问题标题】:How do I replace Database.ExecuteSqlQuery when changing TargetFramework away from.NetCore2.1从.NetCore2.1更改TargetFramework时如何替换Database.ExecuteSqlQuery
【发布时间】:2019-08-24 09:40:19
【问题描述】:

我有以下在带有 SDK 的 .NetCore2.1 中运行良好

Microsoft.AspNetCore.App(2.1.1) 
Microsoft.NetCore.App(2.1.0)

我的代码是

public static int TransitTime(string postcode, ApiDbContext con)
{

    var query = "SELECT top 1 Mins from Transit where postcode = @Postcode order by mins desc;";
    var p1 = new SqlParameter("@Postcode",postcode);
    var result = 0;
    using (var dr = con.Database.ExecuteSqlQuery(query,p1))
    {
        var reader = dr.DbDataReader;
        while (reader.Read()) result = (int)reader[0];
    }
   return Convert.ToInt32(result);
}

将鼠标悬停在“数据库”一词上,我可以看到它在

Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade

我没有看到对

的具体引用
Microsoft.EntityFrameworkCore.Infrastructure 

documented as being part of Entity Framework Core 2.1

在任一 SDK 中,所以我想知道它是如何被引用的。

但是我需要添加对 Framework 4.7.2 dll 的引用

于是我切换到下面的项目文件

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFramework>netstandard2.0</TargetFramework>
  <ApplicationIcon />
    <StartupObject />
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.2.6" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.6" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Common\SBD.Common.csproj" />
  </ItemGroup>
</Project>

现在我得到一个错误

CS1061 'DatabaseFacade' 不包含对 'ExecuteSqlQuery'

我尝试在 Nuget Manage Packages for Solution 中查找表单 Microsoft.EntityFrameworkCore.Infrastructure 但它没有显示。

看着this question,我决定尝试改用.FromSQl。

我找到了help in the docs,但它没有解释如何返回非实体类型。 我该怎么做?

【问题讨论】:

  • FromSql 只有在返回的数据是被访问的类型时才能执行原始 SQL 查询,并且它还期望从数据库返回的列名与映射对象中可用的列名匹配。这就是为什么您需要专门定义 dbset。
  • 谢谢我重命名了问题...我需要返回不在数据库中的类型。
  • 有什么原因不能创建实体类吗?
  • 好吧,你不走运,因为 EF Core 还不支持。这与 .NET Core 无关,EF Core 是与您要升级的 EF6 完全不同的框架。见Compare EF Core & EF6
  • 我正在从 .netcore2.1 升级

标签: c# entity-framework-core


【解决方案1】:

看完the end of this link我在努力

public static int TransitTime(string postcode, ApiDbContext con)
{
    var query = "SELECT top 1 Mins from Transit where postcode = @Postcode order by mins desc;";
    var p1 = new SqlParameter("@Postcode", postcode);
    var result = 0;
    using (var command = con.Database.GetDbConnection().CreateCommand())
    {
        command.CommandText = query;
        command.Parameters.Add(p1);
        con.Database.OpenConnection();
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read()) result = (int)reader[0];
        }
    }
    return Convert.ToInt32(result);
}

我看到这是在 Microsoft.EntityFrameworkCore.Infrastructure 中使用扩展方法

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 2019-01-31
相关资源
最近更新 更多