복붙노트

[SQL] 엔티티 프레임 워크. 테이블의 모든 행을 삭제

SQL

엔티티 프레임 워크. 테이블의 모든 행을 삭제

어떻게 빨리 엔티티 프레임 워크를 사용하여 테이블의 모든 행을 제거 할 수 있습니까?

내가 현재 사용하고 있습니다 :

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

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

어떤 대안이 있습니까?

해결법

  1. ==============================

    1.이 인터넷 검색 여기 나처럼 결국되는 사람들을 위해, 이것은 당신이 현재 EF5 및 EF6에서 그것을 할 방법입니다 :

    이 인터넷 검색 여기 나처럼 결국되는 사람들을 위해, 이것은 당신이 현재 EF5 및 EF6에서 그것을 할 방법입니다 :

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

    상황을 가정하는 것은 System.Data.Entity.DbContext입니다

  2. ==============================

    2.경고 : 다음은 작은 테이블에만 적합 (<1000 개 행을 생각)

    경고 : 다음은 작은 테이블에만 적합 (<1000 개 행을 생각)

  3. ==============================

    3.이 테이블에이 아닌 개별 행에 동작하므로 SQL의 TRUNCATE TABLE 명령을 사용하여 가장 빠른 것입니다.

    이 테이블에이 아닌 개별 행에 동작하므로 SQL의 TRUNCATE TABLE 명령을 사용하여 가장 빠른 것입니다.

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

    dataDb이 DbContext (아닌 ObjectContext를)입니다 가정, 당신은 그것을 포장이 같은 방법을 사용할 수 있습니다 :

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

    4.

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

    5.

    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]");
    }
    
  6. ==============================

    6.당신의 Foreach없이 그렇게 할 수

    당신의 Foreach없이 그렇게 할 수

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

    이 모든 행을 제거합니다

  7. ==============================

    7.어떤 SQL을 사용하여이 피합니다

    어떤 SQL을 사용하여이 피합니다

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

    8.완전히 (더 FKS가 가리키는 없음)는 "잎"표에 콘텐츠 업데이트 : 나는 특별한 경우를 다루는했을 때이 질문을 가로 질러왔다. 이 모든 행을 제거하고 새 행에게 정보를 넣어 참여하고 그것은 (삽입은 어떤 이유로 실패하는 경우 나, 빈 테이블로 끝내고 싶지 않은) 트랜잭션 수행해야합니다.

    완전히 (더 FKS가 가리키는 없음)는 "잎"표에 콘텐츠 업데이트 : 나는 특별한 경우를 다루는했을 때이 질문을 가로 질러왔다. 이 모든 행을 제거하고 새 행에게 정보를 넣어 참여하고 그것은 (삽입은 어떤 이유로 실패하는 경우 나, 빈 테이블로 끝내고 싶지 않은) 트랜잭션 수행해야합니다.

    나는 공공 정적 무효 지우기 (이 DbSet dbSet) 접근 방법을 시도하지만, 새로운 행이 삽입되지 않습니다. 또 다른 disadvante은 행이 하나씩 삭제로 전체 프로세스가 느린 것입니다.

    훨씬 빠른이며 그것은 또한 ROLLBACKable 때문에 그래서, 나는, TRUNCATE 방식으로 전환했다. 또한 정체성을 재설정합니다.

    예 저장소 패턴을 사용 :

    public class Repository<T> : IRepository<T> where T : class, new()
    {
        private readonly IEfDbContext _context;
    
        public void BulkInsert(IEnumerable<T> entities)
        {
            _context.BulkInsert(entities);
        }
    
        public void Truncate()
        {
            _context.Database.ExecuteSqlCommand($"TRUNCATE TABLE {typeof(T).Name}");
        }
     }
    
     // usage 
     DataAccess.TheRepository.Truncate();
     var toAddBulk = new List<EnvironmentXImportingSystem>();
    
     // fill toAddBulk from source system
     // ...
    
     DataAccess.TheRepository.BulkInsert(toAddBulk);
     DataAccess.SaveChanges();
    

    물론, 이미 언급 한 바와 같이,이 솔루션은 외래 키 (TRUNCATE 실패)에 의해 참조 테이블에서 사용할 수 없습니다.

  9. ==============================

    9.만약

    만약

          using(var db = new MyDbContext())
                {
                   await db.Database.ExecuteSqlCommandAsync(@"TRUNCATE TABLE MyTable"););
                }
    

    원인

    그것은 FOREIGN KEY 제약 조건에 의해 참조 될 수 없습니다 잘라 내기 테이블 '을 MyTable'때문이다.

    나는 이것을 사용

          using(var db = new MyDbContext())
                   {
                       await db.Database.ExecuteSqlCommandAsync(@"DELETE FROM MyTable WHERE ID != -1");
                   }
    
  10. ==============================

    10.

    var data = (from n in db.users select n);
    db.users.RemoveRange(data);
    db.SaveChanges();
    
  11. ==============================

    11.당신은 당신의 전체 데이터베이스를 취소하고자하는 경우.

    당신은 당신의 전체 데이터베이스를 취소하고자하는 경우.

    때문에 외래 키 제약은 테이블이 절단되는 순서 문제. 이것은이 순서를 bruteforce하는 방법입니다.

        public static void ClearDatabase<T>() where T : DbContext, new()
        {
            using (var context = new T())
            {
                var tableNames = context.Database.SqlQuery<string>("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME NOT LIKE '%Migration%'").ToList();
                foreach (var tableName in tableNames)
                {
                    foreach (var t in tableNames)
                    {
                        try
                        {
    
                            if (context.Database.ExecuteSqlCommand(string.Format("TRUNCATE TABLE [{0}]", tableName)) == 1)
                                break;
    
                        }
                        catch (Exception ex)
                        {
    
                        }
                    }
                }
    
                context.SaveChanges();
            }
        }
    

    용법:

    ClearDatabase<ApplicationDbContext>();
    

    이 후 DbContext를 reinstantiate해야합니다.

  12. ==============================

    12.SQLite 데이터베이스에 대한 다음 작품 (엔티티 프레임 워크를 사용하여)

    SQLite 데이터베이스에 대한 다음 작품 (엔티티 프레임 워크를 사용하여)

    잘으로 강조 일부 의견 위와 같이 가장 빠른 방법은, 'context.Database.ExecuteSqlCommand ( "일부 SQL")'사용하는 모든 DB 테이블을 취소 한 것으로 보인다. 여기에 내가 너무 테이블의 '인덱스'카운트를 재설정하는 방법을 보여 위하여려고하고있다.

                context.Database.ExecuteSqlCommand("delete from TableA");
                context.Database.ExecuteSqlCommand("delete from sqlite_sequence where name='TableA'");//resets the autoindex
    
                context.Database.ExecuteSqlCommand("delete from TableB");
                context.Database.ExecuteSqlCommand("delete from sqlite_sequence where name='TableB'");//resets the autoindex 
    
                context.Database.ExecuteSqlCommand("delete from TableC");
                context.Database.ExecuteSqlCommand("delete from sqlite_sequence where name='TableC'");//resets the autoindex 
    

    한 가지 중요한 점은 당신이 당신의 테이블에 외래 키를 사용하면 삭제시 테이블의 순서 (계층 구조)이 중요하므로, 먼저 그렇지 않으면 SQLite는 예외가 발생할 수 있습니다, 부모 테이블 전에 자식 테이블을 삭제해야한다는 것입니다.

    참고 : var에 컨텍스트 = 새로운 YourContext ()

  13. ==============================

    13.이것은 EF 5에서 제대로 작동합니다 :

    이것은 EF 5에서 제대로 작동합니다 :

    YourEntityModel myEntities = new YourEntityModel();
    
    var objCtx = ((IObjectContextAdapter)myEntities).ObjectContext;
    objCtx.ExecuteStoreCommand("TRUNCATE TABLE [TableName]");
    
  14. ==============================

    14.EFCore (내가 사용 버전은 3.1입니다)에서 모든 행을 제거하려면 다음 사용할 수 있습니다 -

    EFCore (내가 사용 버전은 3.1입니다)에서 모든 행을 제거하려면 다음 사용할 수 있습니다 -

    context.Database.ExecuteSqlRaw("TRUNCATE TABLE [TableName]");
    
  15. ==============================

    15.모든 기록을 삭제합니다. "잘라 내기"와 같은 기본 인덱스를 재설정하지 마십시오.

    모든 기록을 삭제합니다. "잘라 내기"와 같은 기본 인덱스를 재설정하지 마십시오.

    /// <summary>
    /// SET - DELETE all record by table - no truncate - return deleted records
    /// </summary>
    public static int setListDelAllMYTABLE()
    {
        // INIT
        int retObj = 0;
        using (MYDBEntities ctx = new MYDBEntities())
        {
            // GET - all record
            var tempAllRecord = ctx.MYTABLE.ToList();
            // RESET
            ctx.MYTABLE.RemoveRange(tempAllRecord);
            // SET - final save
            retObj += ctx.SaveChanges();
        }
        // RET
        return retObj;
    }
    
  16. ==============================

    16.당신은 또한 SQL의 어떤 종류를 사용하도록 허용되는 경우는 DbSet에 그것을 할 수 있도록 내 코드에서 나는 정말, 데이터베이스 객체에 대한 좋은 접근하지 않았다. 그것은이처럼 끝으로 정렬합니다 :

    당신은 또한 SQL의 어떤 종류를 사용하도록 허용되는 경우는 DbSet에 그것을 할 수 있도록 내 코드에서 나는 정말, 데이터베이스 객체에 대한 좋은 접근하지 않았다. 그것은이처럼 끝으로 정렬합니다 :

    var p = await _db.Persons.FromSql("truncate table Persons;select top 0 * from Persons").ToListAsync();
    
  17. ==============================

    17.MVC 경우에, 당신은 할 수 있습니다 :

    MVC 경우에, 당신은 할 수 있습니다 :

    public async Task<IActionResult> DeleteAll()
    {
        var list = await _context.YourClass.ToListAsync();
        _context.YourClass.RemoveRange(list);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    
  18. ==============================

    18.모든 아이들이 삭제에 계단식으로합니다 삭제 부모 시도 할 때 확인합니다. 또는 아이들은 널 (NULL) 외래 키가 있습니다.

    모든 아이들이 삭제에 계단식으로합니다 삭제 부모 시도 할 때 확인합니다. 또는 아이들은 널 (NULL) 외래 키가 있습니다.

  19. ==============================

    19.

    var list = db.Discounts.ToList().Select(x => x as Discount);
    foreach (var item in list)
    {
        db.Discounts.Remove(item);
    }
    db.SaveChanges();
    
  20. from https://stackoverflow.com/questions/15220411/entity-framework-delete-all-rows-in-table by cc-by-sa and MIT license