2016-11-09 4 views
3

Entity Framework 6을 사용하여 기본 CRUD 작업을 수행합니다.이 작업은 모두 훌륭합니다. 나는 날짜 범위 내에서 개체를 선택할 수 있어야합니다. 다시 말하지만,이 개체는 전년도 데이터의 본질적 창고 인 여러 데이터베이스에 분산 될 수 있습니다. 일단 우리가 날짜 범위에서 그들을 찾고 있습니다.아카이브 데이터베이스와 함께 Entity Framework 사용

예제 모든 Foo 객체가 2015 년 1 월 1 일부터 2016 년 11 월 9 일 사이에 있어야합니다. 2015 년의 Foo 데이터는 다른 데이터베이스에 저장됩니다. 이것은 2005 년으로 거슬러 올라갑니다. 모든 스키마가 동일하지는 않습니다.

에는 11 개의 EF 프로젝트 또는 11 개의 컨텍스트와 11 개의 연결 문자열이 있습니다. 이 솔루션은 매년 아카이브를 만들 때 코드를 추가해야하는 문제가 있습니다. 이것은 해킹처럼 보인다. Azure 저장 방법으로 교환하는 것은 가까운 미래에는 옵션이 아닙니다.

더 우수한 해결책은 없습니까?

답변

2

모든 데이터베이스에 쿼리하려는 엔터티에 대해 동일한 (또는 비슷한) 스키마가있는 경우 모든 데이터베이스에 단일 DbContext을 가질 수 있으며 연결 문자열을 간단히 전환 할 수 있습니다. 연결 문자열 목록을 관리하고 연결 문자열을 반복하여 각 연결 문자열에 연결하고 각 연결 문자열을 쿼리해야합니다. 물론 데이터베이스의 이름이 일관된 방식 (예 : 연도 별) 인 경우 모든 연결 문자열을 유지 관리 할 필요가 없습니다. 당신의 쿼리가 오직 하나의 DB만을 공격한다면, 당신은 어느 것이 적절한 연결 문자열인지 계산할 수 있습니다. 이것은 표준 샤딩 전략처럼 보이게 될 것입니다. Here은 솔루션 일 수있는 EF 용 Microsoft SQL Azure 샤딩 라이브러리에 대한 참조입니다

또는 SQL Server의 교차 데이터베이스 쿼리 기능을 사용하고 모든 데이터베이스에서보기를 설정할 수 있습니다. 성능 문제는 말할 것도없고 유지 관리 문제가 있지만 데이터 크기를 알 수 없습니다.

+0

이것은 좋은 계획처럼 들립니다. 그래서 우리는 연결 문자열 (아마도 web.config?)을보고 스왑하기 위해 일종의 정규식을 살펴볼 것입니다. 내가 찾고있는 테이블에 대한 스키마는 비슷하지만 동일하지 않습니다. 유창하게 매핑하거나 EF의 규칙에 의존해서 매핑을 수행 할 수 있습니까? (+1 하겠지만 나는 <15 멍청하다.) – Jimbob

+0

@Jimbob 런타임에 EF를 다시 매핑 할 수 없으므로 여러 개의 DbContext를 만들거나 모든 엔티티를 만들어 모든 DB를 검사 한 다음 일치하지 않는 필드에서 null을 확인하십시오. 데이터 액세스 레이어 앞에 응용 프로그램 계층을 두어 일관된 데이터보기를 제공하는 것이 좋을 것입니다. – flipchart

+0

그래서 매년 새로운 상황을 볼 것입니까? 내가 DBA 중 하나가 우리가 날짜 매개 변수를 전달할 수있는 저장된 proc 함께이 서버 쪽 정렬 할 생각 중입니다. 그게 더 나아질까요? – Jimbob