여러 작업자가있는 Entity Framework를 통해 SQL 테이블에 중복을 삽입하지 마십시오.

Juanora

다음 열을 포함하는 Domain이라는 SQL 테이블이 있습니다.

SQL 테이블

동시에 데이터베이스에 행을 삽입하는 여러 에이전트 (작업자)가 있고 중복 도메인 삽입을 피하고 싶습니다. Id는 기본 키이며 변경하지 않습니다.

한편 나는 도메인이 존재하는지 먼저 확인합니다.

public async Task<List<DomainApiModel>> GetListOfExistingDomainsAsync(List<string> domains)
{
    using (eTrafficBacklinks_V2Entities EMME_Context = new eTrafficBacklinks_V2Entities())
    {
        var rec = await EMME_Context.Domains.Where(p => domains.Contains(p.DomainName)).ToListAsync();
        return rec.Select(p => new DomainApiModel(p)).ToList();
    }
}

그런 다음 이미 존재하는 항목을 필터링하고 마지막으로 다음 코드로 존재하지 않는 항목을 삽입합니다.

public int Create(List<DomainApiModel> domainApiList, out List<DomainApiModel> domainApiListWithId, int chunkSizeLimit = 500)
{
    using (eTrafficBacklinks_V2Entities EMME_Context = new eTrafficBacklinks_V2Entities())
    {
        EMME_Context.Configuration.AutoDetectChangesEnabled = false;
        EMME_Context.Configuration.ValidateOnSaveEnabled = false;

        int totalChanges = 0;

        var listOfLists = domainApiList.ChunkSplit(chunkSizeLimit).ToList();
        var listOfDomainData = new List<Domain>();
        foreach (var list in listOfLists)
        {
            foreach (var apiModel in list)
            {
                var objectData = apiModel.GetDataObject();
                EMME_Context.Domains.Add(objectData);
                listOfDomainData.Add(objectData);
            }

            totalChanges += EMME_Context.SaveChanges();
        }

        domainApiListWithId = listOfDomainData.Select(d => new DomainApiModel(d)).ToList();

        return totalChanges;
    }
}

문제는 도메인이 있는지 확인하고 생성하는 사이에 다른 에이전트가 동일한 도메인을 삽입 할 수 있고 테이블에 중복이 있다는 것입니다.

누구든지이 문제를 해결하는 방법에 대해 알고 있습니까?

Obs : nvarchar950 유형 인 "url column"이있는 page라는 테이블에 동일한 문제가 있으므로 고유 인덱스 만 만드는 것은 해결책이 아닙니다.

루 포경

고유해야하는 모든 열에 추가 색인을 추가하십시오. 인덱싱 할 큰 열은 계산 된 해시로 인덱싱 할 수 있습니다.

다음은 많은 엔터티를 만드는 개념과 예외를 추적하는 방법입니다.

class MyService
{

    public async Task<OperationResult<string, SomeEntity>> CreateManyAsync( IList<string> data, int chunkSize )
    {
        var succeded = new List<SomeEntity>( );
        var failed = new List<FailedOperation<string>>( );

        foreach ( var chunk in data.Select( ( dataItem, index ) => new { data = dataItem, chunk = index % chunkSize } ).GroupBy( c => c.chunk, c => c.data ) )
        {
            try
            {
                succeded.AddRange( await InternalCreateManyAsync( chunk ) );
                continue;
            }
            catch ( Exception )
            {
                // we just eat this exception
            }

            foreach ( var singleItem in chunk )
            {
                try
                {
                    succeded.Add( await InternalCreateSingleAsync( singleItem ) );
                }
                catch ( Exception ex )
                {
                    failed.Add( new FailedOperation<string>( singleItem, ex ) );
                }
            }
        }

        return new OperationResult<string, SomeEntity> {
            Succeded = succeded,
            Failed = failed,
        };
    }

    private async Task<IList<SomeEntity>> InternalCreateManyAsync( IEnumerable<string> data )
    {
        var result = new List<SomeEntity>( );

        using ( var db = new MyCOntext( ) )
        {
            foreach ( var item in data )
            {
                result.Add( AddSingleToContext( item, db ) );
            }
            await db.SaveChangesAsync( );
        }

        return result;
    }

    private async Task<SomeEntity> InternalCreateSingleAsync( string data )
    {
        using ( var db = new MyContext( ) )
        {
            var e = AddSingleToContext( data, db );
            await db.SaveChangesAsync( );
            return e;
        }
    }

    private SomeEntity AddSingleToContext( string data, MyContext context )
    {
        var entity = new SomeEntity { Data = data, };
        context.SomeEntities.Add( entity );
        return entity;
    }

}

일부 유틸리티 클래스

class SomeEntity
{
    public int Id { get; set; }
    public string Data { get; set; }
}

class FailedOperation<T>
{
    public FailedOperation( T data, Exception error )
    {
        Data = data;
        Error = error;
    }

    public T Data { get; }
    public Exception Error { get; }
}

class OperationResult<TSource, TResult>
{
    public IList<TResult> Succeded { get; set; }
    public IList<FailedOperation<TSource>> Failed { get; set; }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Entity Framework를 통해 중복 테이블에 대해 다 대다 테이블을 확인하는 방법

분류에서Dev

Spring Boot를 사용하여 Excel 파일을 읽는 동안 MySQL에 중복을 삽입하지 마십시오.

분류에서Dev

Entity Framework를 통해 DB에 업데이트 여러 데이터를 삽입하는 방법

분류에서Dev

중복이있는 경우 다른 테이블에서 테이블로 삽입하지 마십시오

분류에서Dev

SQL-여러 열을 일치시키는 동안 다른 테이블에서 중복 행 삽입을 방지하는 방법

분류에서Dev

사용자로부터 일부 입력을 받고 Entity Framework를 사용하여 여러 테이블 삽입

분류에서Dev

SQL을 사용하여 여러 테이블에서 공통 값 가져 오기

분류에서Dev

여러 테이블에서 검사를 통해 삽입 할 SQL Server 저장 프로 시저

분류에서Dev

문자 수를 세고 SQL 쿼리를 통해 다른 테이블에 삽입하여 한 열을 두 열로 분할하는 방법은 무엇입니까?

분류에서Dev

Entity Framework를 사용하지 않고 ASP NET MVC5를 사용하여 SQL Server의 테이블을 표시하는 방법은 무엇입니까?

분류에서Dev

여러 열로 Entity Framework가있는 SQL 테이블의 모든 중복 레코드 찾기

분류에서Dev

Entity Framework 7을 통해 여러 행을 삽입 할 때 오류 발생

분류에서Dev

C # Entity Framework를 사용하여 임시 테이블에 레코드 삽입

분류에서Dev

AngularJS : JS를 통해 입력 상자 안에 쓰기, JSON에서 값을 전송하지 마십시오.

분류에서Dev

데이터 그룹화를 통해 시퀀스를 추가하는 새 테이블에 SQL 복사 데이터

분류에서Dev

mysql 데이터베이스의 테이블에 존재하지 않는 경우 여러 레코드를 업데이트하거나 삽입하십시오.

분류에서Dev

중복을 통합하는 해시 테이블에서 부하 계수를 계산합니까?

분류에서Dev

Entity Framework에서 ReactiveUI 속성을 매핑하지 마십시오.

분류에서Dev

Entity Framework를 사용하여 SQL CE 데이터베이스 파일에 테이블을 추가하는 방법이 있습니까?

분류에서Dev

Entity Framework를 사용하여 SQL CE 데이터베이스 파일에 테이블을 추가하는 방법이 있습니까?

분류에서Dev

SQL에서 중복 된 레코드를 얻지 마십시오.

분류에서Dev

여러 테이블에서 데이터를 가져오고 html 테이블에 표시하는 SQL 쿼리

분류에서Dev

자바 라이브러리 생성-테스트를 위해 Gradle 종속성을 추가하되 컴파일 된 라이브러리에 포함시키지 마십시오 (또는 재정의 가능하게 만드십시오).

분류에서Dev

SQL 삽입에서 미리 정의 된 값을 반복하지 마십시오.

분류에서Dev

두 개의 서로 다른 테이블에 중복 값과 고유 값을 표시하는 방법 Entity Framework

분류에서Dev

linq2sql을 사용하여 여러 파일이있는 여러 테이블에 레코드를 삽입하는 방법

분류에서Dev

Java에서 웹 스크래핑을 통해 여러 HTML 테이블의 데이터를 가져 오는 방법

분류에서Dev

SQL 테이블을 업데이트하기 위해 HTML 테이블에 여러 양식 요소 작성

분류에서Dev

SQL 쿼리 : 공통 필드를 사용하여 서로 결합하여 여러 테이블에서 데이터를 가져 오지만 테이블에 데이터가 있는지 보장 할 수 없습니다.

Related 관련 기사

  1. 1

    Entity Framework를 통해 중복 테이블에 대해 다 대다 테이블을 확인하는 방법

  2. 2

    Spring Boot를 사용하여 Excel 파일을 읽는 동안 MySQL에 중복을 삽입하지 마십시오.

  3. 3

    Entity Framework를 통해 DB에 업데이트 여러 데이터를 삽입하는 방법

  4. 4

    중복이있는 경우 다른 테이블에서 테이블로 삽입하지 마십시오

  5. 5

    SQL-여러 열을 일치시키는 동안 다른 테이블에서 중복 행 삽입을 방지하는 방법

  6. 6

    사용자로부터 일부 입력을 받고 Entity Framework를 사용하여 여러 테이블 삽입

  7. 7

    SQL을 사용하여 여러 테이블에서 공통 값 가져 오기

  8. 8

    여러 테이블에서 검사를 통해 삽입 할 SQL Server 저장 프로 시저

  9. 9

    문자 수를 세고 SQL 쿼리를 통해 다른 테이블에 삽입하여 한 열을 두 열로 분할하는 방법은 무엇입니까?

  10. 10

    Entity Framework를 사용하지 않고 ASP NET MVC5를 사용하여 SQL Server의 테이블을 표시하는 방법은 무엇입니까?

  11. 11

    여러 열로 Entity Framework가있는 SQL 테이블의 모든 중복 레코드 찾기

  12. 12

    Entity Framework 7을 통해 여러 행을 삽입 할 때 오류 발생

  13. 13

    C # Entity Framework를 사용하여 임시 테이블에 레코드 삽입

  14. 14

    AngularJS : JS를 통해 입력 상자 안에 쓰기, JSON에서 값을 전송하지 마십시오.

  15. 15

    데이터 그룹화를 통해 시퀀스를 추가하는 새 테이블에 SQL 복사 데이터

  16. 16

    mysql 데이터베이스의 테이블에 존재하지 않는 경우 여러 레코드를 업데이트하거나 삽입하십시오.

  17. 17

    중복을 통합하는 해시 테이블에서 부하 계수를 계산합니까?

  18. 18

    Entity Framework에서 ReactiveUI 속성을 매핑하지 마십시오.

  19. 19

    Entity Framework를 사용하여 SQL CE 데이터베이스 파일에 테이블을 추가하는 방법이 있습니까?

  20. 20

    Entity Framework를 사용하여 SQL CE 데이터베이스 파일에 테이블을 추가하는 방법이 있습니까?

  21. 21

    SQL에서 중복 된 레코드를 얻지 마십시오.

  22. 22

    여러 테이블에서 데이터를 가져오고 html 테이블에 표시하는 SQL 쿼리

  23. 23

    자바 라이브러리 생성-테스트를 위해 Gradle 종속성을 추가하되 컴파일 된 라이브러리에 포함시키지 마십시오 (또는 재정의 가능하게 만드십시오).

  24. 24

    SQL 삽입에서 미리 정의 된 값을 반복하지 마십시오.

  25. 25

    두 개의 서로 다른 테이블에 중복 값과 고유 값을 표시하는 방법 Entity Framework

  26. 26

    linq2sql을 사용하여 여러 파일이있는 여러 테이블에 레코드를 삽입하는 방법

  27. 27

    Java에서 웹 스크래핑을 통해 여러 HTML 테이블의 데이터를 가져 오는 방법

  28. 28

    SQL 테이블을 업데이트하기 위해 HTML 테이블에 여러 양식 요소 작성

  29. 29

    SQL 쿼리 : 공통 필드를 사용하여 서로 결합하여 여러 테이블에서 데이터를 가져 오지만 테이블에 데이터가 있는지 보장 할 수 없습니다.

뜨겁다태그

보관