2013-07-26 46 views
6

Tôi gặp vấn đề với Mã khung thực thể Phương pháp tiếp cận đầu tiên trong việc phát triển hệ thống phân cấp cây.Mã EF Đầu tiên. Bộ sưu tập trẻ em là không cho phụ huynh

Tôi cần lưu trữ một số cây trong cơ sở dữ liệu. Bảng của tôi có ba trường Id, Name và Parent_Id. Tôi tạo ra lớp sau trong dung dịch của tôi:

public class TreeNode 
{ 
    public TreeNode() 
    { 
     Children = new List<TreeNode>(); 
    } 

    public int Id { get; set; } 

    [Required] 
    public String Name { get; set; } 

    public virtual IList<TreeNode> Children { get; set; } 

    public virtual TreeNode Parent { get; set; } 
} 

Tôi đã thêm các cấu hình sau đây cho TreeNode lớp

  modelBuilder.Entity<TreeNode>().HasOptional(c => c.Parent) 
        .WithMany(c => c.Children) 
        .Map(m => m.MapKey("Parent_Id")); 

Vấn đề là trẻ em luôn là null khi được trả về bởi EF.

Nhưng nếu truy xuất một số nút con, hãy nhận nút Phụ huynh thông qua thuộc tính Gốc, sau đó Thuộc tính trẻ em được điền chính xác.

Tôi không chắc có gì sai ở đây. Tìm kiếm lời khuyên của bạn.

Cập nhật: bổ sung sửa đổi ảo để tính chuyển hướng không giúp

Trả lời

7

tính Hoặc đánh dấu như virtual, như @Cuong gợi ý. Điều này sẽ cho phép lười biếng nạp (mỗi lần khi bạn sẽ cố gắng để truy cập Trẻ em truy vấn bổ sung cho máy chủ sẽ được thực thi):

public virtual IList<TreeNode> Children { get; set; } 

HOẶC háo hức tải trẻ em khi tải mẹ:

var nodes = context.TreeNodes.Include(n => n.Children); 
+0

Cảm ơn. Ngay cả với các thuộc tính ảo Trẻ em không được trả lại. – lostaman

+0

@lostaman đảm bảo tải lười được bật cho ngữ cảnh 'context.Configuration.LazyLoadingEnabled = true;' –

+0

Cảm ơn @lazyberezovsky. Tôi có tùy chọn này được đặt thành false. Tôi đã thay đổi nó thành true và bây giờ tôi nhận được thông báo lỗi "Đã có một DataReader mở được liên kết với Lệnh này phải được đóng trước" khi cố gắng truy cập bộ sưu tập Trẻ em. – lostaman

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