2012-08-22 2 views
5

나는 코드 우선 (EF 4.3에서)으로 모델링하고 싶을 정도로 이와 비슷한 도메인 클래스를 가지고있다.코드 퍼스트 클래스에 탐색 속성이 필요한 이유는 무엇입니까?

public class Foo { 
    // ... 
} 

public class Bar { 
    // ... 

    public Foo Foo { get; set; } 
} 

public class Baz { 
    // ... 

    public Foo Foo { get; set; } 
} 

은 그래도 볼 때마다 example에서 이물질 참조는 Foo 클래스에 추가됩니다. 내 Foo 클래스가 BarBaz 클래스에 대해 불가지론 자이 될 수 있습니까? 아니면 이렇게해야합니까?

public class Foo { 
    // ... 
    public virtual Bar { get; set; } 

    public virtual Baz { get; set; } 
} 

this answer에 따르면, 클래스 탐색 속성을 가지고 필요성을한다. 저는 Code First에 처음 왔으므로 누구나 이것이 왜 그런지 설명 할 수 있습니까? Fluent API를 사용하여 내 Foo 클래스를 오염시키는 것을 피할 수있는 방법이 있습니까?

나는 Foo이 그것을 사용하는 모든 클래스에 대해 알아야한다는 것이 이상하게 보입니다. 내 디자인에 근본적으로 결함이 있습니까?

답변

1

다른 답변은 부분적으로 정확합니다.

데이터베이스 모델 을 부트 스트랩하려면 테이블 사이에 관계가 있어야합니다. 적어도 하나의 클래스에 탐색 속성을 정의해야합니다.

매핑은 물론 관계 없이도 작동하지만 데이터베이스/sql 수준의 제약 조건은 없습니다. 마이그레이션이나 일부 다른 sql 스크립트를 사용하여 추가하지 않는 한.

비록 당신의 예에서 어떤 식 으로든 관계를 정의하려고 애 쓰지는 않지만. 그게 일대일 관계라고 생각합니까?

그런 경우 Foo는 링크 된 질문에 대한 답변과 같이 참조가있는 다른 클래스에 대해 알 필요가 없으며 하나만 클래스가 있어야합니다.

+0

감사합니다, 이건 내 오해를 명확히. 나는 'Foo'가 네비게이션 속성을 가져야한다고 말하면서 다른 대답을 급하게 오해했다. – Eric

2

여기에서의 문제는 일대일 관계에 대한 요구 사항입니다. EF에서 일대일 관계는 기본 키를 통해 매핑됩니다. 주 엔터티를 선택하고 종속 엔터티는 해당 PK에 FK가 있어야합니다. - 관련된 PK 값이 같아야합니다. 그 이유는 고유 키에 대한 지원이 누락 되었기 때문입니다. 이 제한을 수락하면

당신이 단순히 좋아하는 모델을 사용하고 매핑 할 수 있습니다 :

modelBuilder.Entity<Bar>() 
      .HasRequired(b => b.Foo) 
      .WithOptional(); 

modelBuilder.Entity<Baz>() 
      .HasRequired(b => b.Foo) 
      .WithOptional(); 
+0

이것은 매우 유용합니다. 감사합니다. – Eric

관련 문제