2014-04-11 1 views
0

한 데이터베이스에서 다른 데이터베이스로 데이터를 변환하고 마이그레이션하는 Windows 서비스를 만드는 작업이 수행되었습니다. 내가 당기는 데이터베이스는 하위 부서 중 한 부서에서 개발 한 것으로, 해당 데이터베이스의 구조에 대해서는 말하지 않습니다.Entity Framework에서 복합 키의 일부를 무시하는 방법

내 문제는 내가 당기는 데이터베이스가 작동하는데 문제가있는 몇 가지 본질적인 결함이 있다는 것입니다. 가장 큰 것 중 하나는 여러 테이블에서 기본 키가 복합 기본 키로 설정된다는 것입니다. 이는 큰 문제는 아니지만 연결된 테이블은 복합 키의 일부만 가지고 있습니다. 참조 할 키.

예를 들어 '사람'은 ID와 성을 복합 키로 사용합니다. ID는 대리 자동 증분 정수 키이고 성은 varchar입니다. ID 열만 있으면 사람을 고유하게 식별 할 수 있지만 어떤 이유 때문에 성 키를 합성 키에 포함 시켰습니다. 'Project'는 'People'을 참조하여 프로젝트가 할당 된 사람을 나타냅니다.하지만 'Project'에는 성이 아니라 'PersonID'만 있습니다.

저는 데이터베이스와 액세스 프론트 엔드를보고있었습니다. 실제로 두 관계가 정의되어 있지 않습니다 ... 프런트 엔드를 통해 논리적으로 유지 관리되고 있습니다.

그래서 내가 참여하는 테이블에 다른 테이블의 복합 기본 키에 지정된대로 필요한 모든 열이없는 경우 어떻게 내 탐색 속성을 추가 할 수 있습니까? 기술적으로 ID 번호가 있습니다. 논리적으로 연관성을 만드는 데 필요한 것은 모두 있지만 엔티티 프레임 워크에서는 모든 복합 키 열이 참조 제약 조건에 매핑되어야합니다.

내비게이션 속성을 무시하고 갭을 메우기 위해 로직을 추가하도록 할 수는 있지만 지연로드는 단계적으로 쿼리를 작성해야한다는 것을 의미합니다.

복합 키가 테이블의 ID에 의미있는 공헌을하지 않는 경우 복합 키의 열을 무시할 수있는 방법이 있습니까?

편집

나는 결코 자신의 데이터베이스에 기록되지 않습니다 것 또한주의해야한다. 나는 그들의 데이터에 대해서만 질의를 할 것입니다. 연결하려는 사용자 계정에만 선택 권한이 부여되었습니다.

답변

1

EF는 복합 키에 대해 알 필요가 없습니다. 열이 고유하다는 것을 알고 있으면 EF를 속일 수 있으며 중요한 키 필드에 대해서만 알릴 수 있습니다. 그래도 약간의 작업이 필요합니다.

기존 데이터베이스에 대해 작업 할 때 데이터베이스 우선 접근 방식이 가장 적합하다고 생각합니다. 그럼에도 불구하고해야 할 일이 많습니다. 그러나 EDMX 다이어그램에서 수동으로 입력 한 코드를 사용하는 것이 더 쉽다고 생각합니다.

데이터베이스에서 모델을 생성하면 EF가 EDMX에서 모든 연결을 생성하지 않는다는 것을 알게됩니다. EF는 데이터베이스에 전체 키 (키만 포함)가 포함 된 연결을 생성하기 때문입니다.

이 예제는 매우 단순화 된 데이터 모델을 기반으로합니다. 이 데이터 모델에서 EDMX 모델을 생성 한 후, 도면은 다음과 같다 :

enter image description here

Person는 복합 키를 가지며, FK 데이터베이스에 있지만 PersonProject 간의 연관은 없다.이제 우리는 다음 단계에서 EF를 속이는거야 :

  • 는 기본 키에서 Person.name을 제거 이름을 마우스 오른쪽 버튼으로 클릭하고 "엔티티 키"를 선택 취소합니다.

  • PersonProject 간의 연관 추가 : 다음과 같이, Person를 오른쪽 클릭 새로운 협회를 추가 ... 대화 상자를 기입를 "외래 키 속성을 추가하는 것이

    enter image description here

    주 ... "은 선택되지 않습니다. 이 경우 EF는 새로운 PersonId1 필드를 추가합니다.

  • 외래 키를 수동으로 정의하십시오 : 연관을 마우스 오른쪽 단추로 클릭하고 "속성"을 선택하십시오.

  • 속성 창의 "참조 제한"오른쪽에있는 줄임표를 클릭하십시오.

    enter image description here

는 이제 다이어그램은 다음과 같아야합니다 :

enter image description here

을 완료

  • 대화 상자를 기입!

    또는 ...? 프로젝트를 빌드하거나 다이어그램의 유효성을 검사하면 오류가 표시됩니다.

    오류 3003 : 74 행부터 시작하는 조각 매핑 문제 : Person 테이블의 모든 주요 속성 (Person.Id, Person.Name)

    EF는 쉽게 속지 않습니다. 개념 모델을 수정했습니다. 상점 모델이 아닙니다. EF는 여전히 Person에 데이터베이스에 복합 키가 있음을 알고 있습니다. 어떻게 해결할 수 있을까요? 불행히도 (또는 다행스럽게도) EDMX 디자이너에서는이를 지원하지 않습니다. 우리는 XML을 편집해야합니다.

    XML의 첫 번째 부분에는 저장소 스키마 정의 인 SSDL content이 포함되어 있습니다. 이 유사합니다 Person의 저장 정의를 찾아보십시오 :

    <EntityType Name="Person"> 
        <Key> 
        <PropertyRef Name="Id" /> 
        <PropertyRef Name="Name" /> 
        </Key> 
        <Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" /> 
        <Property Name="Name" Type="nvarchar" MaxLength="50" Nullable="false" /> 
    </EntityType> 
    

    이 라인

    <PropertyRef Name="Name" /> 
    

    이제 속임수가 완료 제거, EF이 행복,이 모델의 유효성을 검사합니다.

    필자는이 마지막 부분이 마음에 들지 않는다는 것을 인정해야합니다. 그것은 당신이 그것을 보는 방식으로 해킹입니다. 그리고 데이터베이스에서 모델을 업데이트 할 때 저장소 모델에서 이러한 신중하게 적용된 수정이 모두 사라졌습니다.

    코드 우선으로 작업하면이 문제가 발생하지 않습니다.Entity Framework Power Tools 또는 VS2013의 새로운 통합 "새 모델 추가"대화 상자를 사용하여 데이터베이스에서 모델을 다시 엔지니어링하고 수동으로 모든 연결을 추가하고 모든 중복 키를 제거 할 수 있습니다. 나는 그것이 훨씬 더 많은 일이라고 생각하지만, 적어도 그것은 "업데이트 안전"이다.

  • 관련 문제