0

코드에 3 개의 엔티티 (EntityA, EntityB, EntityC)가 있고 데이터베이스에 각각의 테이블 (TableA, TableB, TableC)이 있습니다. 또한 세 개의 ID 열 (TableA_ID, TableB_ID, TableC_ID)이있는 기존 조인 테이블이 있습니다.EF 4.1 Fluent API. 세 개의 id 컬럼을 가진 기존 조인 테이블을 사용하면서 두 개의 엔티티를 매핑하는 방법은 무엇입니까?

MODELS: 
public class EntityA 
{ 
    public Guid EntityA_ID { get; set } 
    ..... 
    // Each EntityA can be associated with 0 or Many EntityB 
    public virtual ICollection<EntityB> EntityBCollection { get; set; } 
} 

public class EntityB 
{ 
    public Guid EntityB_ID { get; set; } 
    ..... 
    // Each EntityB can be associated with 0 or Many EntityA 
    public virtual ICollection<EntityA> EntityACollection { get; set; } 

    // Each EntityB can be assocated with 0 or Many EntityC, 
    // but it becomes 0 or 1 when EntityB is associated with an EntityA 
    public virtual EntityC EntityC { get; set; } 
} 

public class EntityC 
{ 
    public Guid EntityC_ID { get; set; } 
    ...... 
    // Each EntityC an only be associated with a EntityB 
    // an EntityC does not exist on its own 
    public virtual EntityB EntityB { get; set; } 
} 

DATA CONTEXT: 
modelBuilder.Entity<EntityB>() 
       .HasOptional(entityb => entityb.EntityC) 
       .WithRequired(entityc => entityc.EntityB) 
       .Map(map => 
       { 
        map.ToTable("ThreeIDColumnJoinTable").MapKey(new string[]{"EntityA_ID", "EntityB_ID", "EntityC_ID"}); 

       }); 

나는 다음과 같은 오류 점점 계속 : 다음과 같이

코드에서, 엔티티는 관련이 나는 데이터 컨텍스트에서 매핑을 다시 구성 할 수있는 방법에

Unable to determine the principal end of an association between the types 'EntityC' and 'EntityB'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations. 

어떤 아이디어를 너무 오류가 발생하지 않으며 ThreeIDColumnJoinTable에 지정된 EntityA의 관계도 포함됩니다.

+0

조인 테이블 항목에 대한 엔티티가 없습니까? 또한 마지막 줄에서'Map' 메소드를 오용하고 있다고 생각합니다. 이 버전은 외래 키 열 이름 만 매핑합니다 (Intellisense의 설명 참조). – Slauma

+0

Slauma, 이전에 (두 개의 열이있는 다 대다 관계의 경우) 이전에 조인 테이블에 대한 엔티티를 작성하지 않았습니다. 또한, "지도"코드는 제가 생각할 수있는 모든 다른 사전 테스트에서의 마지막 시도였습니다. 조인 테이블 엔티티를 만들어 다른 것을 확인해 보겠습니다. 고마워. – fuzzlog

+0

예, 다 대다 조인 테이블의 경우 엔티티가 필요하지 않습니다. 그러나이 테이블은 합성 키를 형성하고 관련 테이블에 대한 FKs 인 정확한 두 열을 가져야합니다. 다른 종류의 조인 테이블은 허용되지 않습니다. – Slauma

답변

0

// Each EntityB can be assocated with 0 or Many EntityC, but it becomes 0 or 1 when EntityB is associated with an EntityA

그런 경우 엔 EntityB의 탐색 속성이 잘못되었습니다. 그것은이어야합니다 :

public class EntityB 
{ 
    public Guid EntityB_ID { get; set; } 
    ..... 
    // Each EntityB can be associated with 0 or Many EntityA 
    public virtual ICollection<EntityA> EntityACollection { get; set; } 

    public virtual ICollection<EntityC> EntityCCollection { get; set; } 
} 

"많은"부분을 지원하려면 EntityC 모음이 필요합니다. 두 번째 부분은 데이터베이스/모델에 의해 적용될 수 없습니다. 응용 프로그램 논리에 의해 강제되어야합니다.

나머지는 그대로 사용할 수 있습니다. 해당 유창한 매핑을 제거하면 A와 B 사이의 다 대다 관계와 B와 C의 일대 다 관계를 가져와야합니다. 이는 규칙이 말하는 것과 정확히 같습니다.

세 테이블에 대해 자동 다 대다와 같은 것은 없습니다. 필요한 경우 (현재 케이스가 아님) 접합점 테이블을 네 번째 엔티티로 맵핑하고 다른 세 엔티티의 네비게이션 특성을 관계형 브리지를 제공하는이 새 엔티티로 지정해야합니다.

+0

Slauma가 지금까지 제공 한 정보를 기반으로, 테이블 (접합/조인 테이블 포함)에 대한 모델을 만든 다음 해당 컨텍스트 클래스의 각 테이블에 대해 DbSet 항목을 추가하면, 그런 다음 적절한 관련 탐색 속성을 각각의 모델에 추가하면 ModelBuilder.Map (...) 메소드를 유창하게 사용할 필요가 없습니다. ()? 그게 올바른 주장입니까? – fuzzlog

+0

나는 당신이 접합 테이블에 대한 엔티티가 필요하지 않을 것이라고 생각하지만 A, B 및 C에 대해서만 엔티티가 필요하다고 생각한다.그렇지 않으면 이해가 정확합니다. –

+0

둘 모두에게 감사드립니다. 나는 대부분의 예제에서 본 것 때문에 Map (...)을 사용하려고 애를 썼다. 조인 테이블에 대한 모델을 작성하고 다른 모델에서 올바른 탐색 특성을 추가하면 문제점이 해결됩니다. – fuzzlog

관련 문제