Entity Framework Core 3 原始 SQL 缺少方法

Fir*_*ion 8 c# entity-framework entity-framework-core .net-core ef-core-3.0

我正在尝试使用 EF Core 3 从表中删除所有行,例如:

db.MyTable.ExecuteSqlRaw("delete from MyTable;");
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

DbSet' 不包含 'ExecuteSqlRaw' 的定义,并且找不到接受类型为 'DbSet' 的第一个参数的可访问扩展方法 'ExecuteSqlRaw'(您是否缺少 using 指令或程序集引用?)

EF Core 3 的 Microsoft 重大更改页面没有提供关于是否需要特殊包来启用此功能的任何建议:

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/break-changes#fromsql-executesql-and-executesqlasync-have-been-renamed

这些是我安装的 Nuget 包:

<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
<PackageReference Include="System.Linq" Version="4.3.0" />
<PackageReference Include="System.Linq.Expressions" Version="4.3.0" />
<PackageReference Include="System.Linq.Queryable" Version="4.3.0" />
Run Code Online (Sandbox Code Playgroud)

使用语句:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;
Run Code Online (Sandbox Code Playgroud)

请注意,FromSqlRaw是可用的,但是ExecuteSqlRawExecuteSqlRawAsync等等都没有。

编辑:我添加了一个using Microsoft.EntityFrameworkCore,错误已更改为:

“DbSet”不包含“ExecuteSqlRaw”的定义,并且最佳扩展方法重载“RelationalDatabaseFacadeExtensions.ExecuteSqlRaw(DatabaseFacade, string, params object[])”需要“DatabaseFacade”类型的接收器

小智 6

我在 dbContext.Database.ExecuteSqlRaw() 上遇到了类似的问题,它已通过安装 Microsoft.EntityFrameworkCore.SqlServer 包而得到修复,甚至不使用该包。

install-package Microsoft.EntityFrameworkCore.SqlServer在您当前的项目中尝试。


CXu*_*ong 6

您需要将 NuGet 包引用添加Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions到您的项目中。

  • 在 .NET 5 (net5.0) 中,它是“Microsoft.EntityFrameworkCore.Relational”。函数名称现在为“FromSqlRaw”(在 DbSet 上)。 (4认同)

Fir*_*ion 5

我对新错误的编辑使我得到了一个答案:

Microsoft Breaking Changes 文档只是没有提供 Execute 方法的示例。为了让它工作,你必须通过“数据库”属性来代替。简而言之,使用这些:

  1. 确保你有 using Microsoft.EntityFrameworkCore;
  2. 如果使用执行使用 myContext.Database.ExecuteSqlRaw(@"...sql to excxute...")