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

新手上路,请多包涵

我想从 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>

原文由 MorgoZ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 545
2 个回答

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

原文由 Nkosi 发布,翻译遵循 CC BY-SA 3.0 许可协议

@Nkosi 是正确的,但从 EF Core 3.x 开始,您应该使用 ExecuteSqlRaw 就像@KevinDimey 说的那样。

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

执行SqlCommand:

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

执行SqlCommandAsync:

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

使用方法:

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

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

原文由 Ogglas 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进