2014-04-14 6 views
1

Entity Framework 6.1, MVC5, ASP.NET 4.5 및 Azure Websites (무료) + Azure SQL을 사용합니다.Entity Framework 및 Microsoft Azure로 일괄 삭제

45000 개의 항목을 삭제하려고하면 45 분 이상 걸립니다. 내 엔티티에 탐색 속성이 있습니다. 나는 그것이 정상이 확실 해요 ...하지만이 문제를 일으키는

foreach(var contact in db.Groups.Find(id).Contacts.ToList()) 
{ 
    context.Database.ExecuteSqlCommand("DELETE FROM Contacts WHERE ContactID = {0}", contact.ContactID); 
} 

:

context.Contacts.RemoveRange(db.Groups.Find(id).Contacts.ToList()); 

그리고이 :

나는이 시도?

+0

두 방법 모두 45 분이 걸립니까? –

답변

0

.ToList()으로 전화를 걸면 시작할 때 해당 엔티티를 모두 메모리로 되돌려 놓습니다. 그리고이 루핑을 통해 여러분의 상황을 이해하면 SQL 45000 번을 효과적으로 호출 할 수 있습니다.

개체를 삭제하려면 전체 개체를 반환하지 않아도됩니다. 난 단지 당신의 쿼리의 ID를 선택하여 삭제 접점의 ID를 잡아 당겨 제안 :

var ids = db.Groups.Find(id).Contacts.Select(x => x.ContactId).ToList(); 

내가 다음이를 처리 할 수 ​​있도록 EntityFrameworkExtensions 라이브러리 (https://github.com/loresoft/EntityFramework.Extended) 중 하나를 실행에 보일 것이다 (최대 배치를 확인하고 삭제) 또는 DELETE FROM Contacts WHERE ContactID IN (1,2,3,....)과 같은 IN 검색어를 사용하지만 다시 한 번 배치합니다. 코드는이 같은 것 이것이 당신이 SaveChanges()

전체 호출 할 때 즉시 실행 및되지 않습니다 그러나

m_context.Contacts.Delete(x => idList.Contains(x.ContactId)); 

참고 :

확장 라이브러리를 사용하면 같이 삭제 할 수 있습니다

public int RemoveContacts(IList<int> _ids) 
{ 
    int index = 0; 
    int numDeleted = 0; 
    while (index < _ids.Count()) 
    { 
     var batch= _ids.Skip(index).Take(MAX_BATCH_SIZE); 

     //Using extensions method 
     numDeleted += context.Contacts.Delete(x => batch.Contains(x.ContactId)); 

     //Using SQL 
     context.Database.ExecuteSqlCommand("DELETE FROM Contacts WHERE ContactID IN {0}", batch); 
     index += MAX_BATCH_SIZE; 
    } 
    return numDeleted ; 
} 
+0

정말 고마워. 그런데 일괄 삽입을 위해 이러한 도구가 있습니까? 나는 여기에 제공된 솔루션을 시도 : http://stackoverflow.com/questions/5940225/fastest-way-of-inserting-in-entity-framework/5942176하지만 같은 45 000 엔티티를 삽입 여전히 8 분 걸립니다 .... .. 왜 그런지는 모르겠지만 모두 삽입 된 후에도 페이지가 savechanges()에 갇혀있는 것처럼 계속로드됩니다. – simonauger

+0

배치 삽입을 수행하는 좋은 방법은 없습니다. 나는 대량 삽입을위한'SqlBulkCopy'를 보았을 것입니다. 또한 컨텍스트 구성에 대한 설정을 사용하여 약간의 도움이됩니다. 'Context.Configuration.AutoDetectChangesEnabled = false;'와'Context.Configuration.ValidateOnSaveEnabled = false;는 나중에 다시 켜는 것을 기억하십시오. – Thewads

+0

Ok 그리고 savechanges()에 갇힌 것처럼 페이지가 계속해서 무한정 계속로드되는 이유는 무엇입니까? 모든 엔티티가 삽입 되더라도? – simonauger