2017-09-08 71 views
6

Chcę wykonać polecenie SQL z Entity Framework Core 2.0, ale nie mogę wymyślić, jak to zrobić.Wykonaj polecenie SQL w Entity Framework Core 2.0, aby usunąć wszystkie dane z tabeli.

1.- Powodem, dla którego potrzebuję, jest to, że chcę usunąć wszystkie dane z tabeli bazy danych, a użycie Context.remove lub Context.removeRange spowodowałoby wiele wywołań do DB (po jednym dla każdego z danych w tabeli).

2.- Czytałem, że istnieje metoda .ExecuteSqlCommand, aby to osiągnąć, ale ta metoda nie jest obecna w mojej Context.Database (może w Core 2.0 została usunięta?). Tutaj jest źródło informacji: Dropping table In Entity Framework Core and UWP

Tak więc, w zasadzie muszę usunąć tabelę z kodu przy użyciu EF Core 2.0 i, o ile mi wiadomo, muszę wykonać polecenie SQL dla tego.

Dziękuję.

Oto moja .csproj, tylko w przypadku jestem brakuje czegoś

<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> 

Odpowiedz

6

Sprawdź, czy odwoływać Microsoft.EntityFrameworkCore zawierać wszystkie niezbędne metody rozszerzenie, które pozwalają na wykonywanie poleceń SQL surowe.

z repozytorium źródłowego znalazłem ExecuteSqlCommand i pokrewnych metod przedłużających

int count = await context.Database.ExecuteSqlCommandAsync("DELETE FROM [Blogs]"); 

Znaleziono artykuł, który zasugerował użyciu ADO.NET.

Najpierw pobiera się połączenie z kontekstu, tworzy polecenie i wykonuje je.

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

Odniesienie to nie wystarczy. Musisz także odwołać się do 'Microsoft.EntityFrameworkCore.Relational', gdzie zdefiniowano' ExecuteSqlCommand [Async] '. – MEMark

-2

Można spróbować to

context.Patients.ToList().ForEach(v => v.ChangeTracker.State = ObjectState.Deleted); 
context.SaveChanges(); 
+0

Czy ktoś może powiedzieć, dlaczego to zajął? – DanteTheSmith

+1

to nie ja, ale myślę, że ponieważ twoje rozwiązanie wygenerowałoby wiele pytań, aby usunąć wszystkie dane, po jednym dla każdej jednostki z ObjectState.Deleted. Appart z tego, twoja odpowiedź odpowiada, jak usunąć wszystkie dane, ale nie jak wykonać polecenie SQL z EF Core. – MorgoZ

+0

Nie głosowałem w dół i tak, to by działało. Ale powiem ci z doświadczenia, że ​​jeśli masz dużą listę pacjentów do usunięcia, może to trwać wiecznie, aby wykonać. Wykonywanie zbiorczego usuwania przy użyciu sql działa o wiele lepiej. – CaseyC585