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

时间:2017-09-08 10:45:23

标签: c# sql entity-framework-core asp.net-core-2.0

我想从Entity Framework Core 2.0执行SQL命令,但我无法弄清楚如何执行此操作。

1.-我需要的原因是,我想删除数据库表中的所有数据,使用Context.removeContext.removeRange会产生很多对DB的调用(每个数据一个)在表中。)

2.-我已经读过有一个方法.ExecuteSqlCommand来实现这一点,但我的Context.Database中没有该方法(可能在Core 2.0中它被删除了吗?)。以下是信息来源:Dropping table In Entity Framework Core and UWP

所以,基本上我需要使用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>

6 个答案:

答案 0 :(得分:23)

确保引用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();
    }
}

答案 1 :(得分:5)

这将执行表方法中每行的任何删除行。

context.ExecuteStoreCommand("TRUNCATE TABLE [" + tableName + "]");
  

TRUNCATE TABLE类似于没有WHERE的DELETE语句   条款;但是,TRUNCATE TABLE更快,使用更少的系统和   事务日志资源。

ExecuteStoreCommand

TRUNCATE TABLE

答案 2 :(得分:1)

Context.Database.ExecuteSqlCommandContext.Database.ExecuteSqlCommandAsyncMicrosoft.EntityFrameworkCore.Relational命名空间中可用。确保您有参考。

然后它将在您的班级中可用,您可以按以下方式调用它,

Context.ExecuteSqlCommand("TRUNCATE TABLE YOURTABLENAME");

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

过时的消息是@KevinDimey答案的补充:

ExecuteSqlCommand:

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

ExecuteSqlCommandAsync:

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

使用方法:

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

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

答案 5 :(得分:-2)

你可以试试这个

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