2014-06-23 8 views
0

나는 두 개의 테이블이두 속성은

class Parent 
    property Child1 : Child 
    property Child2 : Child 

내가

modelBuilder.Entity<Parent>() 
    .Map(f => f.Child1, m => m.Requires("child_number").HasValue(0)) 
modelBuilder.Entity<Parent>() 
    .Map(f => f.Child2, m => m.Requires("child_number").HasValue(1)) 
의 라인을 따라 뭔가를 찾고 있어요 : 제 1 및 제 2 아이에게 연결 속성

두 개의 destinct 파생 형식 Child1 : ChildChild2 : Child이 없어도 가능합니까?

답변

0

역동적 인 ChildN 유형/속성이 가능할 수도 있지만 다른 접근 방식을 사용합니다. 이것이 제가 제안하려고하는 것입니다.

나는 그것을 명시 적으로 Child1, Child2, ..., ChildN에 대한 특성을 갖는하기보다는 Parent 참조에게 아이들의 컬렉션을 갖추는 것이 합리적 상황에서 생각합니다.

나는이 문제가 귀하의 문제를 해결할뿐만 아니라 귀하의 필요를 충족시킬 수있을뿐만 아니라 향후 잠재적 확장을 허용 할 것이라고 주장합니다. 이 작업을 수행하면 별도의 로직을 사용하여 1, 2, ..., n 번째 자식 선택을 처리하게됩니다.

대신 당신은 부모와 자식

public class Parent() 
{ 
    public Parent() { Children = new HashSet<Child>(); } 
    [Required] 
    public int Id {get;set}| 

    //Collection of Child objects as navigation property 
    public virtual ICollection<Child> Children{get;set;} 
} 


public class Child() 
{ 
    [Required] 
    public int ParentId {get;set} 
    [Required] 
    public int ChildNumber{get;set} 

    //Collection of Child objects as navigation property 
    public virtual Parent Parent {get; set;} 
} 

유창함 API 매핑이 포항 강판으로 끝낼. 이 Fluent API 코드는 [필수] 정보를 Property과 같이 IsRequired()과 함께 포함 할 수 있지만, 모델 정의에 쉽게 적용 할 수 있으며 Fluent API의 더 중요한 매핑 정보가 복잡해졌습니다.

mBuilder.Entity<Parent>().HasKey(p=>p.Id); 

mBuilder.Entity<Parent>().HasMany(p=>p.Children) 
    .WithRequired(c=>c.Parent) 
    .HasForeignKey(c=>c.ParentId); 

mBuilder.Entity<Child> 
    .HasKey(c=> new {c.ParentId, c.ChildNumber}); 

N 번째 아이

GetNthChild(parent, N) 
{ 
    return parent.Children.Where(c => c.ChildNumber ==N); 
} 

아니면 심지어 N 번째 아이를 얻기 위해 인덱서를 구현하는 자신의 아이들 클래스를 정의 할 수 있습니다를 검색하기위한 한 가지 방법; 그러나 어떻게 N 번째 아이를 갖기로 결정했는지는 당신에게 달려 있습니다.

+0

제안 해 주셔서 감사합니다. 이것은 현재의 구현과 매우 흡사합니다. 그러나'.Where (c => c.ChildNumber == n) '쿼리를 피하고 SQL 쿼리로 채워진 속성을 갖기를 원했습니다. 확장성에 신경 쓰지 않아도됩니다. 부모님과 자식을 사용한 나의 예가 나쁜 아이디어였습니다. FrontWeel과 BackWeel 두 가지 속성을 가진 클래스 자전거가 더 적절했을 것입니다. –

+0

이해할 수있는 것처럼, 나는 LINQ를 쓰는 것을 피하는 것이 좋을 것이라고 동의합니다. 네비게이션 속성 (또는 원하는대로 동적 인 것)을 사용하더라도 EF는 EF에서 사용되는 Lazy Loading의 일부인 'Parent.Child'를 얻기 위해 여전히 SQL 호출을합니다. 관련 객체를 얻기 위해 SQL 호출을 "피하는"경우 Nav Pro에 대한 지연로드를 비활성화 할 수 있지만이 경우 EF는 Parent를로드 할 때마다 SQL 호출로'Child'를로드합니다. 차이점은 EF에 데이터베이스에서 데이터를 가져 오기를 요청할 때입니다. LINQ 쿼리 사용에 관계없이 EF는 항상 SQL을 사용하여 물건을 가져옵니다. – wtyneb