C# 在Entity Framework Core 2.0中执行SQL命令以删除表中的所有数据
我想从EntityFrameworkCore2.0执行一个SQL命令,但我不知道如何执行 1.-我之所以需要删除,是因为我想从数据库表中删除所有数据,并使用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从代码中删除一个
上下文。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命令。