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

Execute SQL command in Entity Framework Core 2.0 to delete all data in a table

我想从 Entity Framework Core 2.0 执行 SQL 命令,但我不知道该怎么做。

1.- 我需要这样做的原因是我想从数据库 table 中删除所有数据,使用 Context.removeContext.removeRange 会产生许多调用DB(table中的每个数据一个)。

2.- 我读到过有一种方法 .ExecuteSqlCommand 可以实现它,但是我的 Context.Database 中没有这种方法(也许在 Core 2.0 中它被删除了?)。这是信息的来源:

所以,基本上我需要从使用 EF Core 2.0 的代码中删除一个 table,据我所知,我需要为此执行一个 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>

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

这将执行 table 方法中的任何逐行删除方法。

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

TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause; however, TRUNCATE TABLE is faster and uses fewer system and transaction log resources.

ExecuteStoreCommand

TRUNCATE TABLE

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

然后它将在您的 class 中可用,您可以像下面这样调用它,

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

除了@KevinDimey 的回答之外还有过时的信息:

ExecuteSqlCommand:

For the execution of SQL queries using plain strings, use ExecuteSqlRaw instead. For the execution of SQL queries using interpolated string syntax to create parameters, use ExecuteSqlInterpolated instead.

ExecuteSqlCommandAsync:

For the async execution of SQL queries using plain strings, use ExecuteSqlRawAsync instead. For the async execution of SQL queries using interpolated string syntax to create parameters, use ExecuteSqlInterpolatedAsync instead.

使用方法:

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

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