문제

저는 상당히 복잡한 시스템을 설계하는 과정에 있습니다. 우리의 주요 관심사 중 하나는 SQL Server 피어 투 피어 복제를 지원하는 것입니다. 아이디어는 여러 지리적으로 분리 된 노드를 지원하는 것입니다.

이차적 인 관심사는 중간 계층에서 현대 ORM을 사용하는 것입니다. 우리의 첫 번째 선택은 항상 엔티티 프레임 워크였습니다. 주로 개발자가 작업하기를 좋아하기 때문입니다. (그들은 LINQ 지원을 좋아합니다.)

여기에 문제가 있습니다.

피어 투 피어 복제를 염두에두고 모든 테이블의 기본 키에 대해 NewSeventient ()의 기본 값을 가진 고유 한 식별기를 사용하는 데 정착했습니다. 이것은 주요 충돌을 피하고 인덱스 조각화를 줄이는 것 사이의 균형을 잘 제공하는 것처럼 보였다.

그러나 현재 버전의 엔티티 프레임 워크에는 매우 이상한 한계: 엔티티의 키 열이 고유 한 식별기 (Guid) 인 경우 데이터베이스에서 제공 한 기본값 (newSeventientiid ())를 사용하도록 구성 할 수 없습니다. 응용 프로그램 계층은 안내서를 생성하고 키 값을 채워야합니다.

그래서 여기에 토론이 있습니다.

  1. 엔티티 프레임 워크를 포기하고 다른 ORM을 사용하십시오.
    • nhibernate를 사용하고 LINQ 지원을 포기하십시오
    • LINQ2SQL을 사용하고 향후 지원을 포기하십시오 (DB에서 SQL Server에 바인딩되는 것은 말할 것도 없습니다).
  2. 지도를 포기하고 다른 PK 전략을 가지고 가십시오
  3. 애플리케이션 계층에서 순차 안내 (COMBS?)를 생성하는 방법을 고안합니다.

나는 LINQ2SQL (내 개발자가 LINQ2 [stuff]를 정말 좋아합니다)와 3으로 옵션 1에 기대고 있습니다. 주로, 우리가 목표로하는 복제 체계를 지원하는 대체 주요 전략을 다소 무지하기 때문입니다. 개발자의 관점.

모든 통찰력이나 의견은 크게 감사 할 것입니다.

도움이 되었습니까?

해결책

다른 옵션 (게시 될 때 사용할 수 없음)은 서버 생성 GUING을 지원하는 EF 4로 업그레이드하는 것입니다.

다른 팁

두 번째 크레이그의 제안 - 옵션 4.

중간 계층으로 채워진 Guid 열을 기본 키 (논리적 구성)로 사용할 수 있습니다.

대규모 인덱스 (따라서 : 테이블) 조각화를 피하려면 다른 키 (이상적으로 INT ID 열)를 클러스터링 키로 사용하십시오. 이는 기본 키에서 분리 될 수있는 물리적 데이터베이스 구성입니다.

기본적으로 기본 키는 클러스터링 키입니다. 그러나 그렇게 할 필요는 없습니다. 실제로, 나는 데이터베이스 I "상속" - int Identity 열을 추가하고 클러스터링 키를 작고 계속 변화하지 않는 int에 클러스터링 키를 넣어 성능을 향상시키고 단편화를 크게 낮 춥니 다!

마크

뭐? 나는 당신의 세 가지 옵션이 잘못된 선택이라고 생각합니다. 옵션 4를 고려하십시오 :

4) 엔티티 프레임 워크를 사용하십시오 비 순위, 클라이언트 생성 안내서.

EF는 DB-Server 생성 안내서를 볼 수 없습니다 프레임 워크 자체에 의해 삽입 된 새 행의 경우, 물론 DB 서버에서 안내를 생성 할 필요는 없습니다. 엔티티 인스턴스를 만들 때 클라이언트에서이를 생성 할 수 있습니다. 지도의 요점은 당신이 그것을 어디에서 생성하는지는 중요하지 않다는 것입니다. 복제 된 DB에 의해 생성 된지도에 관해서는 EF는 그것들을 잘 볼 수 있습니다.

클라이언트 측 그 안내서는 순차적이지 않지만 (Guid.NewGuid () 사용)는 전 세계적으로 고유하게 보장됩니다.

우리는 배송, 생산 소프트웨어에서 복제를 통해이를 수행합니다. 그것 하다 일하다.

왜 신원 열을 사용하지 않습니까? 병합 복제를 수행하는 경우 각 시스템이 별도의 시드에서 시작하고 한 방향으로 작업 할 수 있습니다 (예 : 노드 A는 1에서 시작하고 1을 추가하고 노드 B가 0에서 시작하고 1을 빼냅니다) ...

실제로 NewSeventient ()를 사용하는 경우 저장된 절차를 사용할 수 있습니다. 결과 열을 절차에서 적절한 속성에 바인딩 할 수 있으며 일단 삽입되면 SQL 생성 GUID가 객체에 공급됩니다.

불행히도 다른 작업이 기본값을 사용하여 올바르게 완료 되더라도 세 가지 작업 (삽입, 업데이트, 삭제)에 대해 SPS를 정의해야합니다. 또한 SP 코드를 유지하고 변경할 때 EF 모델과 동기화되어 있는지 확인해야하므로 추가 오버 헤드로 인해이 옵션을 매력적으로 만들 수 있습니다.

단계별 예제가 있습니다 http://blogs.msdn.com/bags/archive/2009/03/12/entity-framework-modeling-actored-procedures.aspx 꽤 간단합니다.

linq와 함께 자신의 ORM (그다지 어렵지 않음)과 함께 NewSeqid를 사용하십시오.

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