[C#] 엔터티 프레임 워크. 테이블에서 모든 행 삭제

Entity Framework를 사용하여 테이블의 모든 행을 빠르게 제거하는 방법은 무엇입니까?

나는 현재 다음을 사용하고 있습니다 :

var rows = from o in dataDb.Table
           select o;
foreach (var row in rows)
{
    dataDb.Table.Remove(row);
}
dataDb.SaveChanges();

그러나 실행하는 데 시간이 오래 걸립니다.

대안이 있습니까?



답변

인터넷 검색을하고 나와 같은 결과를 얻은 사람들에게는 현재 EF5 및 EF6에서 수행하는 방법입니다.

context.Database.ExecuteSqlCommand("TRUNCATE TABLE [TableName]");

컨텍스트가 System.Data.Entity.DbContext


답변

경고 : 다음은 작은 테이블에만 적합합니다 (<1000 행).

다음은 SQL이 아닌 엔터티 프레임 워크를 사용하여 행을 삭제하는 솔루션이므로 SQL 엔진 (R / DBM)과 관련이 없습니다.

이것은 테스트 또는 이와 유사한 상황을 위해이 작업을 수행한다고 가정합니다. 어느 한 쪽

  • 데이터의 양이 적 거나
  • 성능은 중요하지 않습니다

간단히 전화하십시오 :

VotingContext.Votes.RemoveRange(VotingContext.Votes);

이 문맥을 가정하면 :

public class VotingContext : DbContext
{
    public DbSet<Vote> Votes{get;set;}
    public DbSet<Poll> Polls{get;set;}
    public DbSet<Voter> Voters{get;set;}
    public DbSet<Candidacy> Candidates{get;set;}
}

단정 한 코드의 경우 다음 확장 방법을 선언 할 수 있습니다.

public static class EntityExtensions
{
    public static void Clear<T>(this DbSet<T> dbSet) where T : class
    {
        dbSet.RemoveRange(dbSet);
    }
}

그런 다음 위의 내용이됩니다.

VotingContext.Votes.Clear();
VotingContext.Voters.Clear();
VotingContext.Candidacy.Clear();
VotingContext.Polls.Clear();
await VotingTestContext.SaveChangesAsync();

최근 에이 접근법을 사용하여 각 테스트 사례 실행마다 테스트 데이터베이스를 정리했습니다 (생성 된 삭제 명령의 형태를 확인하지는 않았지만 매번 DB를 처음부터 다시 만드는 것보다 빠릅니다).


왜 느려질 수 있습니까?

  1. EF는 모든 행을 가져옵니다 (VotingContext.Votes)
  2. 그런 다음 ID를 사용하여 (정확한 방법은 중요하지 않음) ID를 삭제합니다.

따라서 많은 양의 데이터로 작업하는 경우 EF가 SQL Server와 동일한 방식으로 모든 데이터를 캐시하므로 IIS 서버에 대해 SQL 서버 프로세스 (모든 메모리를 소비 함)를 종료시킵니다. 테이블에 많은 양의 데이터가 포함되어 있으면 이것을 사용하지 마십시오.


답변

SQL TRUNCATE TABLE명령은 개별 행이 아닌 테이블에서 작동 할 때 가장 빠릅니다.

dataDb.ExecuteStoreCommand("TRUNCATE TABLE [Table]");

dataDbDbContext(가 아닌 ObjectContext) 것으로 가정하면 랩핑하여 다음과 같은 방법을 사용할 수 있습니다.

var objCtx = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)dataDb).ObjectContext;
objCtx.ExecuteStoreCommand("TRUNCATE TABLE [Table]");


답변

var all = from c in dataDb.Table select c;
dataDb.Table.RemoveRange(all);
dataDb.SaveChanges();


답변

using (var context = new DataDb())
{
     var ctx = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext;
     ctx.ExecuteStoreCommand("DELETE FROM [TableName] WHERE Name= {0}", Name);
}

또는

using (var context = new DataDb())
{
     context.Database.ExecuteSqlCommand("TRUNCATE TABLE [TableName]");
}


답변

Foreach없이 할 수 있습니다

dataDB.Table.RemoveRange(dataDB.Table);
dataDB.SaveChanges();

이것은 모든 행을 제거합니다


답변

이것은 SQL 사용을 피합니다.

using (var context = new MyDbContext())
{
    var itemsToDelete = context.Set<MyTable>();
    context.MyTables.RemoveRange(itemsToDelete);
    context.SaveChanges();
}