2

Entityframework 6을 사용하고 있는데 부모 - 자식 종류의 데이터를 데이터베이스에 삽입하려고합니다. Entityframework.BulkInsert를 사용하여 데이터를 삽입하고 있습니다.entityframework.bulkinsert하는 동안 부모 자식 삽입하는 방법?

만이 기록을 저장에
var parentObjects= new List<parentObject>();    
    var childObjects= new List<childObject>(); 

     for (int i = 0; i <= 100; i++) 
     { 
      var parentObj= new parentObject() 
      { 
       Name="p1", 
       Address="a1" 
      }; 

childObjects= SeedInitializer.ChildItems.OrderBy(x => new Random().Next()).Take(2).ToList();//this gets 2 child objects 
      foreach (var childObj in childObjects) 
      { 
       childObj .ParentObject= parentObj; 
       //childObj .CommissionPlanId = i; //tried this still not working 
       parentObj.ChildObjects.Add(childObj);          
      } 
      parentObjects.Add(parentObj); 
     } 
     //when I do a quickwatch on parentObjects, i see child objects in each parentObject, but     
     //with the last id of parentObject 
     context.BulkInsert(parentObjects, 1000); 
     context.SaveChanges(); 

childObject에서 만든이 잘못된 parentObject 아이디 즉, 0 I로 만들어 다음과 같이 나는 자동 증가 INT 기본 키의 모든 테이블

내 객체가되어 있습니다 부모 개체가 생성되는 동안 하위 항목이 생성되지 않는 이유를 이해할 수 없습니다. 누군가 제가 실수를하고있는 곳을 이해하도록 도와 줄 수 있습니까?

+1

행운을 빌어 비슷한 것을 시도합니다. 그럼 내가 읽은 .. https://efbulkinsert.codeplex.com/discussions/532979 – RyanCJI

답변

1

이 작업을 수행하는 쉬운 방법이 없다고 생각합니다. 자식을 삽입하려면 실제로 부모 삽입을 완료하고 해당 ID를 가져와야하기 때문입니다. 일반 EF 인서트는 각 INSERT이 생성 된 식별자를 가져 오도록 SELECT을 포함하므로 자식 (해당되는 경우)에 밀어 넣을 수 있습니다.

한 가지 가능한 해결책은 다음

  1. 가에 Guid RefProperty 추가 지속되는 Guid BatchIdParentObject 유형을 추가 지속되는 Guid RefPropertyParentObject 유형을 추가 ChildObject 지속되지 않는 유형
  2. 다음을 사용하여 전체 구조를 저장하십시오 (주로 의사 코드). 이

    이 아주 못생긴를 테스트하지 않지만 트릭을 수행해야합니다 :

    var batchId = new Guid(); 
    parentObjects.ForEach(item => item.BatchId = batchId); 
    
    // set RefProperty for all parents and children to reflect proper parentation 
    
    TransactionScope scope = null; 
    try 
    { 
        context.BulkInsert(parentObjects, 1000); 
        var newParents = context.ParentObjects.Where(_ => _.BatchId = batchId); 
        var refPropMap = newParents.ToDictionary(_ => _.RefProperty, _ => ParentId); 
        var childObjects.ForEach(item => item.ParentId = refPropMap[item.RefProperty]); 
        context.BulkInsert(childObjects, 1000); 
    
        DataAccess.SaveChanges(); 
        scope.Complete(); 
    } 
    catch (Exception exc) 
    { 
        scope?.Dispose(); 
    } 
    

참고 equence SQL Server에 대한 왕복을 최소화하고 여전히 하나의 단일 트랜잭션합니다.

SELECT을 더 빠르게 만들려면 ParentObject 테이블의 인덱스를 BatchId (해당 키 포함)에 배치해야합니다.

대체 :이 테이블의 디자인을 변경하면 자동 증분이 사용되지 않지만, UNIQUEIDENTIFIER 열이됩니다. 이렇게하면 모든 식별자를 삽입하기 전에 설정할 수 있습니다.

1

면책 조항 : 나는 당신은 할 수 없습니다 EntityFramework.BulkInsert

의 소유자입니다.

이 기능은 절대로 구현되지 않았습니다.

면책 조항은 : 쉽게 이런 종류의 시나리오를 처리 할 수있는 나는, 그러나 Entity Framework Extensions

의 소유자,이 새로운 라이브러리 (무료하지 않음)입니다.

BulkSaveChanges는 SaveChanges (부모/자식 처리)와 똑같이 작동하지만 속도는 빠릅니다!

모든 방법이 지원됩니다 :

  • 대량 SaveChanges를가
  • 대량

  • 대량 업데이트
  • 대량

병합이

  • 대량 삭제 삽입
    // Easy to use 
    context.BulkSaveChanges(); 
    
    // Easy to customize 
    context.BulkSaveChanges(bulk => bulk.BatchSize = 100);