[SQL] 엔티티 프레임 워크. 테이블의 모든 행을 삭제
SQL엔티티 프레임 워크. 테이블의 모든 행을 삭제
어떻게 빨리 엔티티 프레임 워크를 사용하여 테이블의 모든 행을 제거 할 수 있습니까?
내가 현재 사용하고 있습니다 :
var rows = from o in dataDb.Table
select o;
foreach (var row in rows)
{
dataDb.Table.Remove(row);
}
dataDb.SaveChanges();
그러나, 실행하는 데 시간이 오래 걸립니다.
어떤 대안이 있습니까?
해결법
-
==============================
1.이 인터넷 검색 여기 나처럼 결국되는 사람들을 위해, 이것은 당신이 현재 EF5 및 EF6에서 그것을 할 방법입니다 :
이 인터넷 검색 여기 나처럼 결국되는 사람들을 위해, 이것은 당신이 현재 EF5 및 EF6에서 그것을 할 방법입니다 :
context.Database.ExecuteSqlCommand("TRUNCATE TABLE [TableName]");
상황을 가정하는 것은 System.Data.Entity.DbContext입니다
-
==============================
2.경고 : 다음은 작은 테이블에만 적합 (<1000 개 행을 생각)
경고 : 다음은 작은 테이블에만 적합 (<1000 개 행을 생각)
-
==============================
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.
var all = from c in dataDb.Table select c; dataDb.Table.RemoveRange(all); dataDb.SaveChanges();
-
==============================
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.당신의 Foreach없이 그렇게 할 수
당신의 Foreach없이 그렇게 할 수
dataDB.Table.RemoveRange(dataDB.Table); dataDB.SaveChanges();
이 모든 행을 제거합니다
-
==============================
7.어떤 SQL을 사용하여이 피합니다
어떤 SQL을 사용하여이 피합니다
using (var context = new MyDbContext()) { var itemsToDelete = context.Set<MyTable>(); context.MyTables.RemoveRange(itemsToDelete); context.SaveChanges(); }
-
==============================
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.만약
만약
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.
var data = (from n in db.users select n); db.users.RemoveRange(data); db.SaveChanges();
-
==============================
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.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.이것은 EF 5에서 제대로 작동합니다 :
이것은 EF 5에서 제대로 작동합니다 :
YourEntityModel myEntities = new YourEntityModel(); var objCtx = ((IObjectContextAdapter)myEntities).ObjectContext; objCtx.ExecuteStoreCommand("TRUNCATE TABLE [TableName]");
-
==============================
14.EFCore (내가 사용 버전은 3.1입니다)에서 모든 행을 제거하려면 다음 사용할 수 있습니다 -
EFCore (내가 사용 버전은 3.1입니다)에서 모든 행을 제거하려면 다음 사용할 수 있습니다 -
context.Database.ExecuteSqlRaw("TRUNCATE TABLE [TableName]");
-
==============================
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.당신은 또한 SQL의 어떤 종류를 사용하도록 허용되는 경우는 DbSet에 그것을 할 수 있도록 내 코드에서 나는 정말, 데이터베이스 객체에 대한 좋은 접근하지 않았다. 그것은이처럼 끝으로 정렬합니다 :
당신은 또한 SQL의 어떤 종류를 사용하도록 허용되는 경우는 DbSet에 그것을 할 수 있도록 내 코드에서 나는 정말, 데이터베이스 객체에 대한 좋은 접근하지 않았다. 그것은이처럼 끝으로 정렬합니다 :
var p = await _db.Persons.FromSql("truncate table Persons;select top 0 * from Persons").ToListAsync();
-
==============================
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.모든 아이들이 삭제에 계단식으로합니다 삭제 부모 시도 할 때 확인합니다. 또는 아이들은 널 (NULL) 외래 키가 있습니다.
모든 아이들이 삭제에 계단식으로합니다 삭제 부모 시도 할 때 확인합니다. 또는 아이들은 널 (NULL) 외래 키가 있습니다.
-
==============================
19.
var list = db.Discounts.ToList().Select(x => x as Discount); foreach (var item in list) { db.Discounts.Remove(item); } db.SaveChanges();
from https://stackoverflow.com/questions/15220411/entity-framework-delete-all-rows-in-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오라클 11G에서 INSERT SELECT 문 (0) | 2020.05.16 |
---|---|
[SQL] 어떻게 두 개의 열에서 최대 값을 가진 레코드를 선택하려면? (0) | 2020.05.16 |
[SQL] 저장 프로 시저가 CSV 파일에 수출 데이터를 하나 개의 파일 만 수출 (0) | 2020.05.16 |
[SQL] 값이 포스트 그레스 배열에 존재하는지 확인 (0) | 2020.05.16 |
[SQL] MySQL로 변환 SQL Server 쿼리 [중복] (0) | 2020.05.16 |