7

내가 EntityFramework 5를 사용하고는 이미 올바른 DbSets을 설정하고있는 개체는 서로 적절한 참조가 포함되어 있습니다. 이것은 나에게 새로운 것이 아니며 모든 것이 잘 작동합니다.EntityFramework 익명 복합 키 속성 이름이 충돌

이제이 경우 테이블 (또는이 경우 개체)의 외래 키를 포함하는 일부 복합 키가 있습니다. 이를 위해 DbContext의 OnModelCreating 메서드에서 HasKey<>() 함수를 사용합니다. 이러한 속성의 이름이 다른 경우 문제가 없지만 이러한 속성의 이름이 같으면 마이그레이션을 수행 할 수 없습니다.

예 : 사용자가 제공 한 코드에서 볼 수 있듯이

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // ... 

     modelBuilder.Entity<PatientVisit>().ToTable("PatientVisits"); 
     modelBuilder.Entity<PatientVisit>().HasKey(x => 
      new { x.Patient.Code, x.Code }); 

     // ... 

     base.OnModelCreating(modelBuilder); 
    } 

, 객체 PatientVisit 코드라는 이름의 속성을 가지고 있지만,이 속성은 길이가 다른 환자와 반복으로 반복 할 수 있습니다. 엔티티 Patient는 또한 키 정의 된 코드를 가지고 있습니다.

익명 형식은 같은 이름을 유추하는 두 가지 속성을 가질 수 없습니다 (명백하게). 일반적인 솔루션은이 같은 익명 형식의 속성 이름을하는 것입니다 :

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // ... 

     modelBuilder.Entity<PatientVisit>().ToTable("PatientVisits"); 
     modelBuilder.Entity<PatientVisit>().HasKey(x => 
      new { PatientCode = x.Patient.Code, VisitCode = x.Code }); 

     // ... 

     base.OnModelCreating(modelBuilder); 
    } 

그러나이 일을, 내가이 오류 메시지가 발생 마이그레이션을 추가하려고합니다.

The properties expression 'x => new <>f__AnonymousType3`2(PatientCode 
= x.Patient.Code, VisitCode = x.Code)' is not valid. The expression 
should represent a property: C#: 't => t.MyProperty' VB.Net: 'Function(t) 
t.MyProperty'. When specifying multiple properties use an anonymous 
type: C#: 't => new { t.MyProperty1, t.MyProperty2 }' 
VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'. 

답변

0

난 당신이 PatientVisit 새 속성 PatientCode을주고 여기하는 것입니다 필요 생각합니다. 어떤 외래 키 Patient 것입니다. 예

다음
HasRequired<PatientVisit>(v => v.Patient).WithMany() 
              .HasForeignKey(v => v.PatientCode) 

당신은

modelBuilder.Entity<PatientVisit>().HasKey(x => 
     new { x.PatientCode, x.Code }); 
+1

내가 나를 참조 된 개체의 수동 키와 ID를 추가하는 데 필요한 솔루션이 알고 할 수 있지만 그 데이터베이스에 간단한 개체 모델을 "변경"을 의미한다 - 매핑 모델, 나는 그것을하지 않는 것을 선호합니다. –

+0

당신의 솔루션은 내가 구현 한 솔루션과 비슷합니다. DataAnnotations에 의해 수행되기 때문에 유창한 매핑이 필요하지 않습니다. 기본적으로 선언 된 프로퍼티를 가상 네비게이션 프로퍼티의 외래 키에 첨부하기 위해 'ForeignKey' 애트리뷰트를 사용하고 있습니다. 그러나 여전히 앵커 키 또는 외래 키 프로퍼티와 _ 네비게이션 프로퍼티를 명시 적으로 정의해야 함을 의미합니다. 나는 데이터베이스 관련 핵심 속성없이 깔끔하고 깨끗한 객체 모델을 원합니다. –

+0

내가 언급 한 _current-but-not-wanted_ 솔루션의 예는 [this thread] (http://stackoverflow.com/questions/5388077/primary-foreign-key-inentent-framework)를 참조하십시오. 그것은 아주 잘 설명되어 있습니다. –