2011-05-08 2 views
10

나는 최근에 클래스 ManyNavigationPropertyConfiguration<TEntity, TTarget> 으로 왔고 그 클래스 안에서 거기에 2 오버로드와 함께 WithMany()이라는 메서드를 발견했습니다.EF 코드 우선 - WithMany()

제 과부하 : WithMany()

의 관계가 구성 될 많은 다음 관계의 다른 측면 탐색 속성없이 많은.

제 과부하 : 관계의 다른 측면 탐색 속성 많은 : WithMany(Expression<Func<TTarget, ICollection<TEntity>>>)

의 관계를 구성은 많은 한다.

이제 내 질문이 있습니다. 관계를 여러 개 구성해야하는 이유는 무엇입니까? 탐색 속성 (첫 번째 과부하)이없는 많은 이유는 무엇입니까? 나는 도움이 될만한 시나리오를 보지 못했다 ... 어떤 생각?

답변

31

예는이 모델이 될 수 있습니다

public class User 
{ 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public ICollection<Role> Roles { get; set; } 
} 

public class Role 
{ 
    public int RoleId { get; set; } 
    public string Description { get; set; } 
} 

당신이 탐색 속성을 추가, 특정 역할에있는 모든 사용자를 검색 할 수 결코 관심이 있다면 ...

public ICollection<User> Users { get; set; } 

... Role 클래스는 불필요한 오버 헤드가됩니다.

그러나 당신은 여전히 ​​EF UserRole 사이에 다 대다 관계가 존재 함을 알려야합니다 ...

modelBuilder.Entity<User>() 
      .HasMany(u => u.Roles) 
      .WithMany(); 

...기본 규칙 매핑이이 매핑에 해당하는 일대 다 관계 인 잘못된 관계를 생성하기 때문에 다음과 같이 매핑 할 수 있습니다.

modelBuilder.Entity<User>() 
      .HasMany(u => u.Roles) 
      .WithOptional(); 
4

탐색 속성에 대한 선택은 대상의 다른 쪽에서 입니다.

사례를 살펴 보겠습니다.이 사례가 저의 요점에 대한 완벽한 일러스트 레이터가 아닐지라도 ... 수학 테스트를 계속 추적하고 질문을 다시 사용하려는 경우 두 테이블 (TestsQuestions)은 다 대다 관계를 가지고 있습니다. 각 테스트에는 몇 가지 질문이 있으며 각 질문은 여러 테스트에 나타날 수 있습니다. 그러나 특정 질문이있는 테스트 모음을 가져올 필요가 없을 수도 있습니다. 질문이 둘 이상의 테스트에 나타날 수 있지만 어떤 것에 관심이 있는지는 알 수 있습니다.
따라서 선언 할 때 .WithMany() 오버로드를 사용하면 테스트 (theTest.Questions())는 있지만 탐색 속성이없는 탐색 속성 (theQuestion.Tests())을 얻을 수있는 탐색 속성을 얻을 수 있습니다. 그러나 테스트와 질문 모두에서 많은 것을 가질 수 있기 때문에 여전히 다 대다 관계가 필요합니다.
이 경우에는이 설정이 의미가 없을 수도 있지만 확실한 경우가 있습니다. 이러한 경우에는 .WithMany() 오버로드로 인해 속성 (및 각 속성에 대한 람다 식)을 정의하지 않고 얻을 수 있습니다. 너는 절대로 필요 없을거야.

관련 문제