Entity Framework는 추적 된 엔터티를 컨텍스트에서 선택적으로 저장하고 다른 엔터티를 대량 삽입합니다.

bulkinsert c# entity-framework sqlbulkcopy

문제

저는 Entity Framework를 처음 접했습니다. 내 엔티티가있는 시나리오를 발견했습니다.

public class Company{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Project> Projects{ get; set; }
}

public class Project
{
    public int Id { get; set; }
    public List<ProjectRecord> ProjectRecords { get; set; }
    public DateTime ProjectDate { get; set; }
}

public class ProjectRecord
{
    public int Id { get; set; }
    public virtual Project Project{ get; set; }
    public string Status { get; set; }
}

컨텍스트를 만들고 Employer를로드 한 다음 Employer 개체를 다른 클래스에 전달하여 Employer 엔터티에 프로젝트를 추가 한 다음 파일에서 약 300,000 개의 프로젝트 레코드를로드하고이 프로젝트 레코드 목록을 프로젝트에 추가합니다.

Entity Framework는이 모든 것을 추적하며 특히 빠르지는 않지만 그렇게 나쁘지는 않습니다.

느린 부분은 컨텍스트에서 SaveChanges ()를 호출 할 때입니다. 내 컨텍스트에서 프로젝트 레코드 목록을 분리하고 프로젝트없이 프로젝트를 저장하고 https://efbulkinsert.codeplex.com/ 에서 제공된 대량 삽입 확장을 사용하여 ProjectRecord를 별도로 삽입 할 수 있기를 원했습니다. 그러나 ProjectRecords를 분리 할 수있는 방법을 찾지 못했습니다.

따라서 전체 프로젝트 엔티티를 대량 삽입하려고했습니다.

        context.BulkInsert(context,
            context.ChangeTracker.Entries()
                .Where(x => x.State == EntityState.Added)
                .Select(x => x.Entity)
                .OfType<Project>()
                .ToList());

        context.SaveChanges();

그러나 이것은 데이터베이스에 아무 것도하지 않는 데 오랜 시간이 걸리는 것으로 보입니다. 그러므로 나는 그것이 완전히 잘못 될 것이라고 생각합니다.

Employer 엔티티에 프로젝트를 추가 할 때 사용할 수있는 컨텍스트가 없으며 프로젝트를 분리 할 수 ​​있도록 피할 수 있다면 사용 가능하게하지 않으려합니다.

성능 향상을 위해 대량 삽입 확장 또는 sql 대량 복사를 사용하여 컨텍스트에서 SaveChanges를 호출하는 곳이 있습니까?

어떤 도움이라도 대단히 감사합니다.

수락 된 답변

ProjectRecords 를로드 할 때 ProjectRecords 를 컨텍스트에 첨부하지 않는 것이 좋습니다. 너 같이 뭔가 쓸 수있어.

Dictionary<Project, List<ProjectRecord>>

Project 를 가져오고 저장할 때 ProjectRecord.Project 설정하는 데 도움이됩니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.