문제

나는 프로세스에 가져오는 Excel Spreadhseet 및 분석으로 데이터를 제 데이터를 객체입니다.원본 데이터는 심으로 우리는 이동하는 우리의 고객 스프레드시트에서-기반 데이터 관리으로 관리되는 데이터베이스 시스템 확인을 위해 유효한 데이터이다.

중 가져오기,프로세스가 몇 가지 기본적인 정의 검사 데이터를 수용하는 어떻게 나쁜 데이터 수 있는 우리를 가져오지만,나는 나의 전반적 유효성 검사에서 수행되는 DbContext.

의 일부분 무슨 내가 하려는 것은 내가 원하는 제공하는 행#스프레드시트에서 데이터는 나쁜 그래서 그들은 쉽게 확인할 수 있습니다 그들이 무엇을 수정해야를 얻는 파일을 가져옵니다.

한 번가에서 데이터를 스프레드시트(model고),기회 그들은 작업에서 데이터베이스(opp),여기서 의사의 프로세스:

foreach (var model in Spreadsheet.Rows) { // Again, pseudocode
    if(opp != null && ValidateModel(model, opp, row)) {
        // Copy properties to the database object

        // This is in a Repository-layer method, not directly in my import process.
        // Just written here for clarity instead of several nested method calls.
        context.SaveChanges(); 
    }
}

을 제공할 수 있는 이상의 코드는 여기는 경우가 필요하지만,문제에 온 나의 DbContext ValidateEntity() 방법(정 DbContext).

다시 말하지만,거기에 아무 잘못된 코드를 썼어요,마찬가지로 지금까지 내가 알고 있지만,경우에는 기회 실패한 이러한 수준의 유효성,그것은 유지의 일부로서 구원받지 못한 개체에 context, 을 의미는 그것을 반복하려고 검증하마 ValidateEntity() 라고 합니다.이것을 반복의 동일한 유효성 검사 오류 메시지의 모든 행에 대한 후 처음 문제가 발생합니다.

하는 방법이 있[편집]컨텍스트를 정지하려고 검증하는 개체를 한 후 그것이 유효성 검사에 실패하면 한 번[편집]?나는 알 수 있었습이 끝날 때까지 기다리고 전화 context.SaveChanges() 에 한 번 말하지만,나는 수치로 이것이 무엇 행 그것은 데이터베이스에서.

참고로 나는 엔티티 프레임 워크를 사용하여 6.1 코드로 처음 접근 방식이다.

편집 하려는 명확한 마크 L.(업데이트를 포함하여 코드 블록상)

지금,나의 프로세스가 반복을 통해 많은 행 있기 스프레드시트에서.왜 내가 내장소 계층을 가진 각 객체를 저장하는 대신의 작업을 하는 방식으로만 통화 context.SaveChanges() 면을 허용하는 것이 자신의 능력을 결정하는 줄은 하나의 원인이 되는 유효성 검사 오류가 있습니다.

나는 기쁘다는 내 DbContext 의 사용자 정의 ValidateEntity() 방법은 유효성 검사 오류하지만,문제에 있지 않다는 사실을 던지 DbEntityValidationException 같은 엔터티를 여러 번 나옵니다.

내가 좋아하는 경우에는 개체의 유효성 검사에 실패하면,컨텍스트가 더 이상을 저장하려고 물체에 관계없이,얼마나 많은 시간을 context.SaveChanges() 라고 합니다.

도움이 되었습니까?

해결책

귀하의 질문 속는(이 절약에 대해,로드되지 않체)하지만 당신을 따를 수 있었던 조언이다.즉,엔터티를 추가하는 컨텍스트를 추적에서"추가"상태를 중지에서 다시 검증하여 분리습니다.그것은 그렇-내부 링크는,그러나 나는 것을 재현하는 코드:

dbContext.Entry(entity).State = EntityState.Detached;

그러나 나는 생각하지 않는 방법 당신은 당신이 가고 싶기 때문에,당신이 사용하는 예외는 상태를 관리하는 불필요(예외는 악명 높게 비싼).

에서 일하고 주어진 정보,나는 사용자 설정합 기반의 솔루션:

  • 모델을 수정할 수는 클래스가 포함 RowID 기록하는 원래 행 스프레드시트(아마도 다른 좋은 이유는 이것도)
  • 끄 entity-에 대한 추적 컨텍스트(의 변화 감지도록 각각의 Add() 수 O(1))
  • 모든 추가 엔티티
  • 전화 context.GetValidationErrors() 모든 당신의 오류에 한하여,상기 RowID 를 식별하는 잘못된 행이 있습니다.

당신이 하지 않지 여부를 나타내의 과정을 저장해야 좋은 행하거나 거부하는 파일 전체적으로,그러나 이 수용할 것 중 하나는,필요하신 경우에는 저장 좋은 행 분리,모두가 잘못된 행 코드를 사용하여 위의 다음 SaveChanges().


마지막으로,당신이 경우에 저장하고 싶은 좋은 행고 당신은 불편하게 설정합 기반 방법,그것은 더 나은 것을 사용하여 새로운 DbContext 한 모든 단,또는 적어도 새로 생성 DbContext 각 후에 오류가 있습니다.이 ADO.NET 팀 주장하는 컨텍스트를 만들은"비교적 저렴한"(미안하지 않는 인용 또는 통계에 대한 손에이)이 없는 손상 당신의 처리에 너무 많다.그럼에도,그것은 적어도 남아 있 O(n).나는 당신,관리하는 대형 컨텍스트를 열 수 있을 뿐만 아니라 다른 문제.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top