我想从Entity Framework Core 2.0执行SQL命令,但我无法弄清楚如何执行此操作。
1.-我需要的原因是,我想删除数据库表中的所有数据,使用Context.remove
或Context.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>
答案 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更快,使用更少的系统和 事务日志资源。
答案 2 :(得分:1)
Context.Database.ExecuteSqlCommand
和Context.Database.ExecuteSqlCommandAsync
在Microsoft.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();