역동적 인 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 번째 아이를 갖기로 결정했는지는 당신에게 달려 있습니다.
제안 해 주셔서 감사합니다. 이것은 현재의 구현과 매우 흡사합니다. 그러나'.Where (c => c.ChildNumber == n) '쿼리를 피하고 SQL 쿼리로 채워진 속성을 갖기를 원했습니다. 확장성에 신경 쓰지 않아도됩니다. 부모님과 자식을 사용한 나의 예가 나쁜 아이디어였습니다. FrontWeel과 BackWeel 두 가지 속성을 가진 클래스 자전거가 더 적절했을 것입니다. –
이해할 수있는 것처럼, 나는 LINQ를 쓰는 것을 피하는 것이 좋을 것이라고 동의합니다. 네비게이션 속성 (또는 원하는대로 동적 인 것)을 사용하더라도 EF는 EF에서 사용되는 Lazy Loading의 일부인 'Parent.Child'를 얻기 위해 여전히 SQL 호출을합니다. 관련 객체를 얻기 위해 SQL 호출을 "피하는"경우 Nav Pro에 대한 지연로드를 비활성화 할 수 있지만이 경우 EF는 Parent를로드 할 때마다 SQL 호출로'Child'를로드합니다. 차이점은 EF에 데이터베이스에서 데이터를 가져 오기를 요청할 때입니다. LINQ 쿼리 사용에 관계없이 EF는 항상 SQL을 사용하여 물건을 가져옵니다. – wtyneb