C# 在Entity Framework Core 2.0中执行SQL命令以删除表中的所有数据

C# 在Entity Framework Core 2.0中执行SQL命令以删除表中的所有数据,c#,sql,entity-framework-core,asp.net-core-2.0,C#,Sql,Entity Framework Core,Asp.net Core 2.0,我想从EntityFrameworkCore2.0执行一个SQL命令,但我不知道如何执行 1.-我之所以需要删除,是因为我想从数据库表中删除所有数据,并使用上下文。remove或上下文。removeRange将产生许多对DB的调用(表中每个数据一个) 2.-我已经读到有一种方法.ExecuteSqlCommand来实现这一点,但该方法不存在于我的Context.Database中(可能在Core2.0中它被删除了?)。以下是信息来源: 所以,基本上我需要使用EF Core 2.0从代码中删除一个

我想从EntityFrameworkCore2.0执行一个SQL命令,但我不知道如何执行

1.-我之所以需要删除,是因为我想从数据库表中删除所有数据,并使用
上下文。remove
上下文。removeRange
将产生许多对DB的调用(表中每个数据一个)

2.-我已经读到有一种方法
.ExecuteSqlCommand
来实现这一点,但该方法不存在于我的Context.Database中(可能在Core2.0中它被删除了?)。以下是信息来源:

所以,基本上我需要使用EF Core 2.0从代码中删除一个表,据我所知,我需要为此执行一个SQL命令

多谢各位

这是我的.csproj,以防万一我遗漏了什么

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.0" PrivateAssets="All" />    
  </ItemGroup>

  <ItemGroup>
    <!--<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" />    -->
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
  </ItemGroup>

</Project>

netcoreapp2.0
$(AssetTargetFallback);便携式-net45+win8+wp8+wpa81;

确保引用Microsoft.EntityFrameworkCore以包含所有允许您执行原始SQL命令的必要扩展方法

从源存储库中,我找到了
ExecuteSqlCommand
和相关的扩展方法

int count = await context.Database.ExecuteSqlCommandAsync("DELETE FROM [Blogs]");
找到一篇建议使用ADO.Net的文章

首先,从上下文中获取一个连接,创建一个命令并执行它

using (var connection = context.Database.GetDbConnection()) {
    await connection.OpenAsync();     
    using (var command = connection.CreateCommand()) {
        command.CommandText = "DELETE FROM [Blogs]";
        var result = await command.ExecuteNonQueryAsync();
    }
}
你可以试试这个

 context.Patients.ToList().ForEach(v => v.ChangeTracker.State = ObjectState.Deleted);
 context.SaveChanges();

这将在任何“从表中删除每行”方法上执行

context.ExecuteStoreCommand("TRUNCATE TABLE [" + tableName + "]");
TRUNCATE TABLE类似于不带WHERE的DELETE语句 条款然而,TRUNCATE TABLE速度更快,使用的系统和内存更少 事务日志资源


Context.Database.ExecuteSqlCommand
Context.Database.ExecuteSqlCommandAsync
可在
Microsoft.EntityFrameworkCore.Relational
命名空间中找到。确保你有它的参考资料

然后它会在你的课堂上出现,你可以像下面这样称呼它

Context.ExecuteSqlCommand("TRUNCATE TABLE YOURTABLENAME");

对于EF Core 3.x,请使用以下名称空间和代码:

using Microsoft.EntityFrameworkCore; 
...
context.Database.ExecuteSqlRaw("TRUNCATE TABLE [TableName]");

@Nkosi是正确的,但由于EF Core 3.x,您应该像@KevinDimey所说的那样使用
ExecuteSqlRaw

除了@kevindimety的答案之外,还有一些过时的消息:

ExecuteSqlCommand:

要使用纯字符串执行SQL查询,请使用 改为ExecuteSqlRaw。用于执行SQL查询,使用 插值字符串语法要创建参数,请使用 ExecuteSqlInterpolation

ExecuteSqlCommandAsync:

对于使用纯字符串异步执行SQL查询,请使用 改为ExecuteSqlRawAsync。用于异步执行SQL查询 使用插值字符串语法创建参数时,请使用 改为ExecuteSqlInterpolatedAsync

使用方法:

context.Database.ExecuteSqlRaw("DELETE FROM [Blogs]");

await context.Database.ExecuteSqlRawAsync("DELETE FROM [Blogs]");

不是我,但我认为这是因为您的解决方案将生成多个查询来删除所有数据,每个ObjectState.Deleted实体对应一个查询。显然,您的答案回答了如何删除所有数据,但没有回答如何从EF Core执行SQL命令。我没有否决投票,是的,这将“起作用”。但我会根据经验告诉你,如果你有一个大的病人名单要删除,这可能需要永远执行。使用sql执行批量删除的性能要好得多。仅此引用是不够的。您还需要引用Microsoft.EntityFrameworkCore.Relational,它是定义
ExecuteSqlCommand[Async]
的地方。在EF Core 3.1中,我们不应该包装
var connection=context.Database.GetDbConnection()
块在
中编码>。当你这么做的时候,上下文的连接已释放,之后尝试使用它将出现以下错误:
ConnectionString属性尚未初始化。
.ExecuteSqlRaw在3.1中似乎不存在。您需要添加到nuget包Microsoft.EntityFrameworkCore.Relational中才能访问ExecuteSqlRaw命令。