어떻게 EF7 유창 API를 사용하여 단일 POCO에 대한 두 테이블을 만들 수 있습니까?

c# ef-code-first entity-framework entity-framework-core

문제

단일 엔티티 유형에 대해 두 개의 테이블을 생성하려고합니다. 테이블은 두 번째 키가 외래 키를 놓칠 수 있다는 점을 제외하면 비슷합니다 (btw, 그 질문의 맥락에서 그리 중요하지 않습니다).

첫 번째 테이블은 일반적인 방법으로 사용됩니다 (쿼리 선택, 작은 삽입 쿼리 등).

두 번째 테이블은 임시이며 대량 삽입 작업에 사용됩니다 (예 : 먼저 SqlBulkCopy를 사용하여 임시 테이블에 데이터를 삽입 한 다음 항목을 첫 번째 테이블로 업서 트하려면 MERGE 쿼리를 사용합니다). 이러한 접근 방식을 통해 수천 개의 레코드를 매우 빠르게 업서 트할 수 있습니다.

그렇다면 EF7이 동일한 엔티티에 대해 동일한 두 개의 테이블을 생성하도록하는 가장 좋은 방법은 무엇입니까?

나는 비슷한 질문을 발견했다 : EF Code First에서 두 개의 동일한 테이블에 대해 동일한 유형을 사용하라 . 그러나 그 사람 (질문하는 사람)이 같은 엔티티로 여러 DbSets을 원한다. 필자의 경우는 조금 다르다. 단지 테이블 생성을 자동화하고 싶다.

수락 된 답변

좋아, 내가 그 질문에 대답 할 수있는 것 같아.

그래서, 사실 저는 하나의 추악한 솔루션을 가지고 있습니다 : 동일한 상속을 사용하여 동일한 DbContext에서 다른 DbSet을 생성하는 데 사용할 수있는 동일한 엔티티를 생성 할 수 있습니다.

또한 EF 상속 전략을 사용하지 않으려면 기본 유형을 매핑 해제해야합니다 (예 : DB 스키마에서 상속 연결된 변경 사항이 필요 없음). 이 요구 사항은 기본 클래스 (매핑되지 않음)와 두 개의 상속자 (기본 테이블 DbSet 용 테이블과 임시 테이블 DbSet 용 테이블)를 생성하도록합니다.

이러한 접근 방식을 통해 같은 유형의 문제 를 피할 수 있었고 더 중요한 것은 문제없이 테이블 스키마를 정확히 동일하게 유지할 수 있다는 것입니다.

예:

/// <summary>
/// Base entity, not used by EF at all - intended to define properties only.
/// </summary>
public class MyEntityBase
{
    public int Id { get; set; }
    public string Name { get; set; }
}

/// <summary>
/// That entity used to create primary table and used by app logic.
/// </summary>
public class MyEntity : MyEntityBase
{
}

/// <summary>
/// That entity used to create temp table only.
/// </summary>
public class MyTempEntity : MyEntityBase
{
}

/// <summary>
/// Here is our DB context with two DbSets...
/// </summary>
public class MyDbContext : DbContext
{
    /// <summary>
    /// That DbSet should be used by app logic.
    /// </summary>
    public DbSet<MyEntity> MyEntities { get; set; }

    /// <summary>
    /// That DbSet will force EF to create temp table.
    /// App logic shouldn't interact with it in common way 
    /// (only SqlBulkCopy and some hand-written queries) 
    /// so it is not public.
    /// </summary>
    protected DbSet<MyTempEntity> MyTempEntities { get; set; }
}



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