2011-02-26 1 views
39

내가 매핑하지만 헛된을 추가하는 시도 모든자체 참조 대다 재귀 관계 코드 첫 번째 엔티티 프레임 워크

class Member 
{ 
    public virtual IList<Member> Friends { get; set; } 
    [Key] 
    public int MemberId { get; set; } 
    public string Name{ get; set; } 
} 

에서이 작업을 할 수없는 것. CTP5로 그렇게 할 수있는 방법이 있습니까?

+0

이 코드는 먼저 코드와 관련이 있다고 생각하지 않지만 [이 게시물] (http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/05198b97-f178-49ba-91da-7a2516a9ad8d)을 확인하십시오. 아웃. –

답변

56

은, 코드 먼저 일대로 단방향 연결을 취할 것입니다.

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Member>().HasMany(m => m.Friends).WithMany(); 
} 

참고 : 따라서 당신이 코드 먼저 당신이 많은 자기 참조 협회에 많은 갖고 싶어 알려 유창하게 API를 사용할 필요 조인 당신은 사용자 정의 할 수 없습니다 CTP5에서 알려진 버그가 있습니다 이 시나리오에서 테이블 열 이름.

+2

Morteza, 나는 당신과 당신의 블로그에서 당신을 따라 왔습니다. 이것은 완벽하게 작동합니다! 결과 테이블은 [MemberMembers]라는 이름이 붙어 있지만 별난 것은 RTM에서 수정 될 것입니다. 고마워! – Korayem

+0

안녕하세요, 어떻게 여러 개의 자체 참조를 사용할 수 있는지 알아야합니다. 예를 들어 같은 샘플 코드에서; 공개 가상 IList 친구 {get; 세트; } public 가상 IList 부모 {get; 세트; } –

+0

이것은 완벽하게 작동했습니다. 감사합니다. 생성 될 many-to-many 테이블의 이름을 지정하는 것이 무엇인지 아십니까? MemberMembers는 정상적으로 작동하지만 추한 것처럼 보입니다. –

0

예제는 다 대다 관계가 아니며 재귀 관계와 관련이 있습니다.

수정 방법을 잘 모르겠습니다. 하지만 코드의 문제는 같은 이름의 동일한 행에 두 개의 필드가 생기는 것입니다. 행의 id에 대한 MemberId와 친구의 id에 대한 MemberId.

편집

은 다음과 같이 그 일을보십시오 : 관례

class Member 
    { 
     [Key] 
     public int MemberId { get; set; } 
     public string Name { get; set; } 

     public virtual IList<FriendRelationship> Friends { get; set; } 

    } 

    class FriendRelationship 
    { 
     [Key] 
     public int RelationshipId { get; set; } 

     public Member Friend { get; set; } 
    } 
+0

나에게있어서 [LeftMemberId]와 [RightMemberId]를 가진 [Friends] 테이블을 도입함으로써 해결할 수 있기 때문에 many-to-many가 될 수 있습니다. 정확한 이름 지정에 관계없이 작동하지 않습니다. ( – Korayem

+0

Thanx mate, 솔루션을 시도하기 위해 변경 사항을 얻지 못했지만이를 수동으로 수행하는 초기 해결책이었습니다 .RTM을 기다릴 수 없습니다. :) – Korayem

2

Model-First를 사용하여 EF 4 CTP5에서 작동하도록 할 수 있지만 CTP5 코드 우선은 자체 참조 및 다형성 쿼리 구성에 너무 많은 버그가있어서 이러한 시나리오에 대해 코드 우선을 사용합니다. Morteza Manavi (다른 답변 참조)는 자신의 블로그에 여러 기사를 기록했습니다.

+0

사실. 희망의 RTM이 우리의 요구를 충족시킵니다. 코드 첫 번째는 멋지다! – Korayem

16

나는이 코드로 많은 테이블 이름에 많은 영향을 미칠 수있는 올바른 오전 경우 :이 도움이

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Member>().HasMany(m => m.Friends).WithMany().Map(m => 
     { 
      m.MapLeftKey("MemberId"); 
      m.MapRightKey("FriendId"); 
      m.ToTable("MembersFriends"); 
     } 
    ); 
} 

희망.

관련 문제