2013-02-12 2 views
0

나는 다음과 같은 테이블 구조가 : 내 파티를 사용매핑하는 동안 속성으로 외래 키 노출에 충돌

Parties 

Id Name 
100 Hank 
200 Ted 
300 Kim 
400 Joe 

Affiliations 

Id Party1 Party2 
1  100  200 
2  300  400 

그리고 소속의 FKS를 통해 참조 테이블을 엔티티 (표시되지 않음), Fluent API를 사용하여 테이블 간의 관계를 정의합니다.

modelBuilder.Entity<Party>() 
      .HasMany(c => c.LeftPartyAffiliations) 
      .WithRequired() 
      .Map(m => m.MapKey("Party1")); 

modelBuilder.Entity<Party>() 
      .HasMany(c => c.RightPartyAffiliations) 
      .WithRequired() 
      .Map(m => m.MapKey("Party2")); 

파티 엔티티는 왼쪽 및 오른쪽 관계를 각각의 속성 인 LeftPartyAffiliationsRightPartyAffiliations에 매핑합니다. 위의 규칙을 정의하면 EF가 Affiliations 테이블에 Party1Party2을 자동으로 추가합니다.

내 문제는 각 제휴지도의 값이 올바르게 표시되지만이 표를 내 열에 매핑 할 때 왼쪽 및 오른쪽에있는 제휴 ID를 알 수있는 방법이 없다는 점입니다 내 당 관계를 통해. 예를 들어

, 나는 실제 Party1에 액세스 할 수 있도록하고 싶습니다과 Party2 ID를 내 제휴 법인을 통해 :

public class PartyAffiliation 
{ 
    ... 

    [Column("Party1")] 
    public int Party1 { get; set; } 

    [Column("Party2")] 
    public int Party2 { get; set; } 

    ... 
} 

을 ...하지만 난 이미 매핑을 통해 나의 관계를 정의하고 이것은 불가능하다 Fluent API를 통해 Party의 왼쪽 및 오른쪽 컬렉션으로 이동합니다.

완벽하게 배치하면 Fluent API 매핑을 사용하여 열과 관계를 만들뿐 아니라 내 Affiliation 매핑에 정의 된 물리적 열을 통해 내 Party1 및 Party2 Id에 액세스 할 수 있습니다. 내가 엔티티뿐만 아니라 유창함 API에 phyically 속성을 정의하려고하면

, 내가 얻을 : 유형에

각 속성 이름은 고유해야합니다. 속성 이름은 이미 이 문제 또는 물리적으로 데이터베이스에 추가 필드를 추가하지 않고 여러 속성에 열을 매핑하는 방법에 대한 해결 방법은 'XXX'

정의?

+1

Affiliations 테이블의 구조를 일반으로 변경하는 것이 더 쉽지 않을까요? Id, PartyId, Type 필드가 있습니다. 그렇게하면 세 번째 열로 필터링 할 수 있고 고정 된 두 개의 열 대신에 원하는만큼 광고 할 수 있습니다 (party1, party2, party3, ..., n) – amhed

+0

@amhed 주목해야 할 것은, 데이터베이스 구조를 제어하십시오.필자는 기본적으로 디자인을 기반으로 구조를 생성하기 위해 먼저 코드를 사용했습니다. –

+0

데이터베이스에 이미 키가 있습니까? 왜 데이터베이스 우선 접근법을 사용하지 않습니까? – amhed

답변

1

당신은 MapKey 대신 HasForeignKey를 사용할 수 있습니다

modelBuilder.Entity<Party>() 
    .HasMany(c => c.LeftPartyAffiliations) 
    .WithRequired() 
    .HasForeignKey(pa => pa.Party1) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<Party>() 
    .HasMany(c => c.RightPartyAffiliations) 
    .WithRequired() 
    .HasForeignKey(pa => pa.Party2) 
    .WillCascadeOnDelete(false); 

그것은 데이터베이스의 외래 키 열에 모델 클래스에 속성을 매핑합니다. 여기서 계단식 삭제를 비활성화해야합니다 (적어도 두 관계 중 하나에 해당). 그렇지 않으면 Party에서 PartyAffiliation까지 여러 계단식 삭제 경로가 SQL Server에서 금지됩니다.

+0

당신은 남자입니다! –