POCO/코드 우선 4.1 업그레이드시 EF 4.0 사용.HasForeignKey()없이 외래 키를 참조하는 방법
OK 도메인 모델이 Car
인 경우 컬렉션에 Part
유형의 개체가 여러 개 있습니다. 그래서 하나 : 많은 관계.
HasMany(v => v.Parts)
.WithRequired()
.HasForeignKey(v => v.CarId)
.WillCascadeOnDelete();
이 문제는 내 Part
유형으로 CarId
속성을 추가하는 저를 필요로한다는 것이다. 이것은 내 도메인 모델에 ORM 세부 정보가 누출되고 있습니다. 모든 가상을 표시하는 것은 충분히 성가시다.
이 개체 모델에 노출 입니다 외래 키 속성 (들)을 사용하는 관계를 구성하십시오
이 말한다. 외래 키 속성이 이 개체 모델에 노출되어 있지 않은 경우 Map 메서드를 사용하십시오.HasForeignKey()
방법에 대한 XML 문서 주석을 보면
모두 훌륭합니다. 그러나 내가 원하지 않는 CarId
속성을 제거하여 내 Part
유형을 리팩토링하면 내 속성 모델 매핑에 신경 쓰지 않고 EF 모델 작성기를 업데이트하므로 catch-22 상황이 발생합니다.
HasKey(v => new { v.CarId, v.PartId });
HasKey()
HasKey()
를 호출 할 수 없음을 의미합니다.
해결책은 무엇입니까?
나는 당신의 질문 제목이 있어야한다고 생각한다 : "모든 기본 키 열을 모델의 속성으로 공개하지 않고 기본 키를 정의하는 방법" 실제로 문제가 아닌가? 'CarId'를 죽임으로써 FK 속성 (쉬운 것)뿐만 아니라 복잡한 PK의 일부 (아마도 불가능 함)를 제거하고자합니다. – Slauma
당신 말이 맞아요. 여기서 핵심은 내 도메인 모델에서 불필요한 "뒤로 참조"를 원하지 않는다는 것입니다. 도메인 모델은 그 (것)들을위한 필요가 없으며 단지 동기화 상태를 유지하는 고통이됩니다. 나는 EF가 역 참조로 내 도메인 모델을 오염시킬 필요가있는 것처럼 보이는데, 이는 순수하게 RDBMS 관심사이다. – nbevans
EF에서 역 참조가 필요하지 않습니다. 노출하는 것은 선택 사항입니다. 문제는 복합 기본 키가 있고 그 중 일부는 외래 키입니다. 일반적으로 당신은 외래 키 속성을 제거 할 수 있지만 동시에 PK의 일부이기 때문에 귀하의 경우에는 그렇지 않습니다. 그리고 당신은 모델 클래스에서 PK를 제거 할 수 없습니다. 가장 좋은 방법은'PartId'를 프라이 머리 키로 만드는 것입니다. 그런 다음'CarId'를 제거 할 수 있습니다. 그것은 기본적으로 hazimdikenli가 그의 대답에서 제안한 것입니다. – Slauma