2017-11-06 9 views
1

나는 2 개 테이블이 들어있는 데이터베이스가 있습니다 각 아파트는 두 개 이상의 세입자를 가질 수관련 SQL 테이블에서 EF를 통해 빠른 대량 삽입을 수행하는 방법은 무엇입니까?

Apartment: ID, Name, Address 
Tenant: ID, Name, Phone, ApartmentID 

을하지만, 각 세입자는 한 아파트에있을 수 있습니다.

Apartments : [ 
    { 
     Name: 'Sherwood', 
     Address: '21 Woody Lane' , 
     Tenants : [ 
      { Name: 'Robin', Phone: '111-1111' }, 
      { Name: 'Hood', Phone: '222-2222' } 
     ] 
    }, 

    ... 


] 

내가 API는 2 관련 객체로 결과를 구문 분석해야합니다 아파트의 현재 목록을 반환하는 API 및 JSON 목록으로 그 아파트에 세입자의 목록도 있습니다

, 아파트 및 임차인을 찾아서 데이터베이스에 삽입하십시오. API에서 반환 된 많은 항목이 약 50 만 개 있습니다. 문제를 빨리 해결하기 위해 다음과 같은 아이디어를 얻었습니다. Fastest Way of Inserting in Entity Framework

그러나 내 솔루션에서 구현할 수없는 개념, 즉 SaveChanges()를 연기하는 개념이 하나 있습니다. 이것은 내가 현재 코드 (개념)를 가지고하는 방법입니다

Foreach apartment 
    Insert apartment into DB 
    SaveChanges() 
    Get ID of inserted apartment 
    Foreach tenant in apartment 
     Insert tenant into DB, into apartment ID 

세입자 행을 삽입 할 때, 나는 그 세입자가 살고 있다는 아파트 ID를 필요로하는 상기 구조에 대한 이유 때문에 나는 필요 세입자를 삽입하기 전에 아파트를 삽입 (그리고 ID를 얻기 위해 변경 사항을 저장)해야합니다.

이로 인해 SaveChanges()가 여러 번 호출되어 성능이 저하되고 있습니다. 위의 솔루션을 어떻게 최적화 할 수 있습니까?

답변

1

당신은 탐색 속성에 할당 할 수있는 - EF는 다음과 같이 저장에 처리됩니다

Foreach apartment 
    dbContext.Appartments.Add(apartment); 
    foreach tenant 
    tenant.Appartment = apartment; 
    dbContext.Tenants.Add(tenant); 
    endforeach tenant 
endforeach apartment 

SaveChanges(); 
0

는 엔티티 프레임 워크에는 Bulk Insert 없습니다. 이러한 종류의 작업을 수행하려면 타사 라이브러리를 사용해야합니다.

기본적으로 Entity Framework는 모든 엔터티가 저장하도록 데이터베이스를 왕복 이동합니다. 따라서 시나리오에서 500,000 개 이상의 데이터베이스 왕복이 필요합니다. INSANELY slow.


면책 조항 : 나는이 도서관은 무료로하지 않습니다하지만 당신은 BulkInsert을 포함한 모든 대량 작업을 수행하고 자동으로 Id's을 반환 할 수 있습니다 Entity Framework Extensions

의 소유자입니다. 또한 IncludeGraph 옵션 관련 개체를 삽입 할 수 있습니다 :

  • 벌크
  • 대량 대량 업데이트
  • 대량 병합
  • 삭제 삽입

    • 대량 SaveChanges를

    // Easy to use 
    context.BulkSaveChanges(); 
    
    // Easy to customize 
    context.BulkSaveChanges(bulk => bulk.BatchSize = 100); 
    
    // Perform Bulk Operations 
    context.BulkDelete(customers); 
    context.BulkInsert(customers); 
    context.BulkUpdate(customers); 
    
    // Customize Bulk Operations 
    context.BulkInsert(customers, options => { 
        options => options.IncludeGraph = true; 
    }); 
    context.BulkMerge(customers, options => { 
        options.ColumnPrimaryKeyExpression = 
         customer => customer.Code; 
    });