2011-05-10 3 views
1

POCO/코드 우선 4.1 업그레이드시 EF 4.0 사용.HasForeignKey()없이 외래 키를 참조하는 방법

OK 도메인 모델이 Car 인 경우 컬렉션에 Part 유형의 개체가 여러 개 있습니다. 그래서 하나 : 많은 관계.

HasMany(v => v.Parts) 
    .WithRequired() 
    .HasForeignKey(v => v.CarId) 
    .WillCascadeOnDelete(); 

이 문제는 내 Part 유형으로 CarId 속성을 추가하는 저를 필요로한다는 것이다. 이것은 내 도메인 모델에 ORM 세부 정보가 누출되고 있습니다. 모든 가상을 표시하는 것은 충분히 성가시다.

이 개체 모델에 노출 입니다 외래 키 속성 (들)을 사용하는 관계를 구성하십시오 HasForeignKey() 방법에 대한 XML 문서 주석을 보면

이 말한다. 외래 키 속성이 이 개체 모델에 노출되어 있지 않은 경우 Map 메서드를 사용하십시오.

모두 훌륭합니다. 그러나 내가 원하지 않는 CarId 속성을 제거하여 내 Part 유형을 리팩토링하면 내 속성 모델 매핑에 신경 쓰지 않고 EF 모델 작성기를 업데이트하므로 catch-22 상황이 발생합니다.

HasKey(v => new { v.CarId, v.PartId }); 

HasKey()

비 속성 람다에 따라 키를 정의하는 지원하기 위해 표시되지 않습니다 : 그럼 당신이 상상할 수있는대로 난 후, ALA 복합 키를 정의하는 HasKey()를 호출 할 수 없음을 의미합니다.

해결책은 무엇입니까?

+0

나는 당신의 질문 제목이 있어야한다고 생각한다 : "모든 기본 키 열을 모델의 속성으로 공개하지 않고 기본 키를 정의하는 방법" 실제로 문제가 아닌가? 'CarId'를 죽임으로써 FK 속성 (쉬운 것)뿐만 아니라 복잡한 PK의 일부 (아마도 불가능 함)를 제거하고자합니다. – Slauma

+0

당신 말이 맞아요. 여기서 핵심은 내 도메인 모델에서 불필요한 "뒤로 참조"를 원하지 않는다는 것입니다. 도메인 모델은 그 (것)들을위한 필요가 없으며 단지 동기화 상태를 유지하는 고통이됩니다. 나는 EF가 역 참조로 내 도메인 모델을 오염시킬 필요가있는 것처럼 보이는데, 이는 순수하게 RDBMS 관심사이다. – nbevans

+0

EF에서 역 참조가 필요하지 않습니다. 노출하는 것은 선택 사항입니다. 문제는 복합 기본 키가 있고 그 중 일부는 외래 키입니다. 일반적으로 당신은 외래 키 속성을 제거 할 수 있지만 동시에 PK의 일부이기 때문에 귀하의 경우에는 그렇지 않습니다. 그리고 당신은 모델 클래스에서 PK를 제거 할 수 없습니다. 가장 좋은 방법은'PartId'를 프라이 머리 키로 만드는 것입니다. 그런 다음'CarId'를 제거 할 수 있습니다. 그것은 기본적으로 hazimdikenli가 그의 대답에서 제안한 것입니다. – Slauma

답변

1

외래 키 속성을 절대 사용하지 않으려는 경우 FK 속성 검색 규칙을 제거하여 EF가 다음과 같이 자동으로 속성을 표시하지 않도록 할 수 있습니다. 이 차의 일부이기 때문에 모델의

HasMany(v => v.Parts) 
    .WithRequired() 
    .WillCascadeOnDelete(); 

당신은 여전히 ​​CarId 필요 FK 속성은 ...

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Conventions 
     .Remove<NavigationPropertyNameForeignKeyDiscoveryConvention>(); 
} 

... 그리고 단순히지도에서 FK 속성을 지정하지 열쇠,하지만이 방법은 행동하지 않습니다. 외래 키 속성으로 ymore.

아이디어만으로도 작동하는지 확실하지 않습니다.

1

글쎄, CarPartId와 같은 CarParts 테이블에 새로운 키 필드를 추가하면 복합 키가 필요하지 않습니다. (복합 키 지원은 ORM으로 작업 할 때 그다지 좋지 않습니다.)

관련 문제