我想从Entity Framework Core 2.0中执行SQL命令,但是我不知道该怎么做。
1.-之所以需要这样做,是因为我想从数据库表中删除所有数据,并使用Context.remove
或Context.removeRange
会产生许多对DB的调用(表中的每个数据一个)。
2.-我已经读到有一种方法.ExecuteSqlCommand
可以实现此目的,但是该方法在我的Context.Database中不存在(也许在Core 2.0中已被删除?)。这是信息的来源:在Entity Framework Core和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>
确保引用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();
}
}
该参考文献还不够。您还需要参考
Microsoft.EntityFrameworkCore.Relational
这就是ExecuteSqlCommand[Async]
定义。在EF核心3.1我们不应该包裹
var connection = context.Database.GetDbConnection();
在一个using
块。当您这样做时,上下文的连接被释放,之后尝试使用它将产生此错误:The ConnectionString property has not been initialized.
。