7

tôi có tổ chức này:Mã EF đầu tiên: Cách tải dữ liệu liên quan (cha-con-cháu)?

public class DynamicPage { 

    public int PageId { get; set; } 

    public int Order { get; set; } 

    public string MenuText { get; set; } 

    public string MenuHover { get; set; } 

    public int? ParentId { get; set; } 

    public virtual DynamicPage Parent { get; set; } 

    public virtual ICollection<DynamicPage> Children { get; set; } 
} 

thực thể này có thể có 3 mức: mẹ -> Trẻ em -> Cháu. Làm thế nào tôi có thể tải phụ huynh (cấp 1) whit tất cả trẻ em liên quan (cấp 2) và cho mỗi đứa trẻ, cháu liên quan (cấp 3) nếu có? Nhờ giúp đỡ.

Trả lời

10

EF 4.1 tính năng và cú pháp:

var entity = context.Parents 
    .Include(p => p.Children.Select(c => c.GrandChildren)) 
    .FirstOrDefault(p => p.Id == 1); // or whatever condition 
+0

Không có thuộc tính nào có tên là 'Cháu trẻ'. Bạn có nghĩa là mã này: 'Bao gồm (p => p.Children.Select (c => c.Children))'? –

+0

@Javad_Amiry: Có. Trên thực tế, những gì tôi đã viết là 'GrandChildren' có thể là bất kỳ thuộc tính điều hướng nào - tập hợp hoặc tham chiếu. Mẫu 'Include (x => x.SomeCollection.Select (c => c.SomeNavigationProperty))' chỉ gây ra 'Bao hàm' cho cấp độ tiếp theo. Bạn có thể lặp lại quảng cáo đó: 'Select' trên bộ sưu tập, đường dẫn rải rác đơn giản trên tham chiếu. – Slauma

+0

Cảm ơn, chỉ một vài phút, để tôi kiểm tra nó xin vui lòng –

0

Nếu bạn muốn làm cho cuộc sống dễ dàng hơn, hãy làm theo Quy tắc đầu tiên về mã đặt tên ID của bạn chỉ đơn giản là Id (hoặc, cách khác, tên bảng + Id, ví dụ: DyanmicPageId).

này nên để lại cho bạn một cái gì đó như thế này:

public class DynamicPage 
{ 
    public int Id { get; set; } 
    public int Order { get; set; } 
    public string MenuText { get; set; } 
    public string MenuHover { get; set; } 
    public int? ParentId { get; set; } 

    public virtual DynamicPage Parent { get; set; } 
    public virtual ICollection<DynamicPage> Children { get; set; } 
} 

Sau đó, bạn cần phải thiết lập mối quan hệ giữa cha mẹ và con cái một cách rõ ràng trong một phương pháp OnModelCreating trong lớp DbContext của bạn.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<DynamicPage>() 
     .HasMany(page => page.Children) 
     .WithRequired(child => child.Parent) 
     .HasForeignKey(child => child.ParentId); 
} 

Sau đó bạn có thể chọn con hay cháu khi cần thiết:

var parent = dbContext.DynamicPages.Where(page => page.ParentId == null); 
var children = parent.Children; 
var grandchildren = parent.SelectMany(page => page.Children); 
var allRelatedPages = parent.Union(children).Union(grandchildren); 
+0

đang u nói về cái gì? Plz đọc lại Q: ** Làm thế nào tôi có thể tải bố mẹ (cấp 1) whit tất cả trẻ em liên quan (cấp 2) và cho mỗi đứa trẻ, cháu liên quan (cấp 3) nếu có? ** Tôi biết cách ánh xạ các thực thể và biết cách tải chúng trong mối quan hệ 2 cấp * Parent-Child *. Nhưng tôi không thể tải liên kết 3 cấp. Chỉ cái này! –

+0

Bạn có ý nghĩa gì khi "tải"? Bạn có nghĩa là chọn? – devuxer

+0

Tải từ cơ sở dữ liệu, tìm nạp từ db, chọn. Như thế này: 'entity.DynamicPages.Where (d => d.ParentId == null) .Bao gồm (d => d.Children) .ToList();' Tôi biết điều này, nhưng tôi muốn tải 'd.Children. Trẻ em mà tôi không thể): –

Các vấn đề liên quan