2013-10-09 5 views
0

나는 EF5 코드를 먼저 시험하고 있으며 모델을 사용 중입니다 (아래 참조).Entity Framework 코드 첫 번째 관계; 나는 무엇을 놓치고 있습니까?

작성된 데이터베이스를 볼 때 카테고리 테이블을 가리키는 트랙 테이블에 아무 것도 표시되지 않기 때문에 혼란 스럽습니다. 카테고리는 FK가 Track을 가리키고 있지만 범주의 중복이 될 것입니다.

약간의 배경 : 트랙이있는 모델을 만들기 위해 노력하고 있으며 모든 트랙에 1 ~ N 개의 카테고리가있을 수 있습니다. 모든 범주가 ​​이미 정의되어 있습니다. 즉, 기본적으로 조회이며 데이터베이스를 만들 때 시드 메서드에서 범주를 만들려고합니다.

나는 명백한 것을 이해하지 못한다고 생각합니다 ... 내가 트랙을 쿼리 할 때, 그것이 어떤 카테고리에 들어 있는지 어떻게 알 수 있습니까?

들으

public class Track : IAuditInfo 
{ 
    public Int32 Id { get; set; } 
    public String Name { get; set; } 
    public String Description { get; set; } 
    public String Data { get; set; } 
    public DateTime CreatedOn { get; set; } 
    public DateTime ModifiedOn { get; set; } 

    public ICollection<Category> Categories { get; set; } 

    public Track() 
    { 
     Categories = new List<Category>(); 
    } 
} 

public class Category 
{ 
    public Int32 Id { get; set; } 
    public Boolean IsVisible { get; set; } 
    public String DisplayName { get; set; } 
} 
+0

둘을 결합한 'TrackCategories' (또는 유사) 테이블이 없습니까? –

+0

'Category'에는'TrackId'가 있습니다. 하나의'Track'에는 많은'Categories'가 있습니다. 문제가 무엇입니까? –

+0

아니요. 내 문제 일 가능성이 높습니다. 그 점을 완전히 놓치기 때문에 더 읽어야 할 것 같습니다. – user2864862

답변

1

현재 모델은 트랙과 범주 사이에 일대 다 관계입니다. 이것은 대개 엔티티 프레임 워크가하는 것처럼, 한쪽 (트랙)의 여러 측면 (카테고리)에 외래 키를 사용하여 구현 한 것으로 구현됩니다.

내가 올바르게 이해한다면, 당신이 원하는 것은 다 대다 관계입니다. 많은 트랙이 동일한 카테고리와 관련 될 수 있으며 단일 트랙은 여러 카테고리에 속할 수 있습니다.

당신이 다 - 대 - 다 관계를 원한다는 것을 엔티티 프레임 워크가 이해할 수있게하려면 단순히 ICollection 속성을 카테고리 클래스에 추가하면됩니다. 그래서 두 클래스 모두 다른 클래스의 콜렉션을 가져야합니다. 즉, 트랙에는 많은 카테고리가 있고 카테고리에는 많은 트랙이 있습니다.

자세한 내용은 당신은 또한 볼 수 있습니다 http://msdn.microsoft.com/en-us/data/hh134698.a.nospx

0

올라프는 맞다, 순간에 데이터 모델이에서 many-to-many 관계가 있음을 엔티티 프레임 워크를 이야기하지 않습니다.

이 문제를 해결하는 가장 간단한 방법은 Category 클래스에

public virtual ICollection<Track> Tracks { get; set; } 

를 추가하는 것입니다.

그러나 ... 도메인과 관련이없는 인공물로 도메인 모델을 오염시키고 싶지 않을 수 있습니다. 무엇보다 바인딩 테이블을 호출하는 것이 무엇인지 파악하기 위해서는 Entity Framework가 필요합니다. EF6 이전에이 이름은 비 결정적인 (http://entityframework.codeplex.com/workitem/1677 참조)입니다. 이는 동일한 코드를 컴파일하는 두 개의 다른 컴퓨터가 해당 테이블의 다른 이름을 결정하고 프로덕션 시스템에서 흥미로운 마이그레이션 문제를 일으킬 수 있음을 의미합니다.

두 가지 문제에 대한 해답은 항상 Fluent 구성을 사용하여 다 대다 관계를 명시 적으로 관리하는 것입니다.데이터 컨텍스트 클래스에서

OnModelCreating,이 같은 오버라이드 (override) : 이렇게하면

public class MyDb : DbContext 
{ 
    public IDbSet<Track> Tracks { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Track>() 
      .HasMany(t => t.Categories) 
      .WithMany() 
      .Map(c => c.ToTable("CategoriesForTracks")); 
    } 
} 

, 당신이 할 을하지 여전히 있지만, 당신의 카테고리 클래스에 탐색 속성을 추가 할 필요가 (할 수 있으면 WithMany에 대해 과부하를 사용하여 속성을 지정할 수 있습니다.)

엔티티 간의 관계 및이를 관계형 데이터베이스에 매핑하는 방법은 본질적으로 어렵습니다. 가장 단순한 부모 - 자식 관계 이외의 다른 것들에 대해서는 유창한 API를 사용하여 실제로 원하는 것을 얻고 싶을 것입니다.

Morteza Manavi는 EF Code First의 관계를 자세히 설명하는 really good blog series을 가지고 있습니다.

당신은 일반적으로 탐색 속성 가상을해야 참고. 그래서, 당신은이처럼 Category 클래스를 변경해야합니다

public virtual ICollection<Category> Categories { get; set; } 

을 이론적으로, 그것은 가상 단지 열망 로딩보다는 일어나는 게으른 로딩을 야기한다 만드는 없습니다. 실제로 내 탐색 속성이 가상이 아닌 경우 항상 미묘한 버그가 많이 발견되었습니다.

관련 문제