내가 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 }'.
내가 나를 참조 된 개체의 수동 키와 ID를 추가하는 데 필요한 솔루션이 알고 할 수 있지만 그 데이터베이스에 간단한 개체 모델을 "변경"을 의미한다 - 매핑 모델, 나는 그것을하지 않는 것을 선호합니다. –
당신의 솔루션은 내가 구현 한 솔루션과 비슷합니다. DataAnnotations에 의해 수행되기 때문에 유창한 매핑이 필요하지 않습니다. 기본적으로 선언 된 프로퍼티를 가상 네비게이션 프로퍼티의 외래 키에 첨부하기 위해 'ForeignKey' 애트리뷰트를 사용하고 있습니다. 그러나 여전히 앵커 키 또는 외래 키 프로퍼티와 _ 네비게이션 프로퍼티를 명시 적으로 정의해야 함을 의미합니다. 나는 데이터베이스 관련 핵심 속성없이 깔끔하고 깨끗한 객체 모델을 원합니다. –
내가 언급 한 _current-but-not-wanted_ 솔루션의 예는 [this thread] (http://stackoverflow.com/questions/5388077/primary-foreign-key-inentent-framework)를 참조하십시오. 그것은 아주 잘 설명되어 있습니다. –