Từ khóa ảo có thể có tác dụng gì trong Entity Framework 4.1 Mã POCO đầu tiên?


229

Liệu các virtualtừ khóa có tác dụng khi sử dụng trên các thuộc tính trong EF Mã Đầu tiên ?. Ai đó có thể mô tả tất cả các phân nhánh của nó trong các tình huống khác nhau?

Chẳng hạn, tôi biết nó có thể kiểm soát việc tải lười biếng - nếu bạn sử dụng từ khóa ảo trên một thuộc tính quan hệ ICollection / một-nhiều, nó sẽ được tải theo mặc định, trong khi nếu bạn bỏ từ khóa ảo, nó sẽ được háo hức.

virtualTừ khóa nào có thể có hiệu ứng khác trong EF với các thực thể POCO?. Tôi nên đặt mặc định để sử dụng virtualtrên tất cả các thuộc tính của mình hoặc mặc định không sử dụng nó?

Câu trả lời:


194

Cho đến nay, tôi biết về những hiệu ứng này.

  • Tải chậm : Bất kỳ virtualICollection nào cũng sẽ được tải nhanh trừ khi bạn đặc biệt đánh dấu chúng theo cách khác.
  • Theo dõi thay đổi hiệu quả hơn . Nếu bạn đáp ứng tất cả các yêu cầu sau thì theo dõi thay đổi của bạn có thể sử dụng phương pháp hiệu quả hơn bằng cách nối các thuộc tính ảo của bạn. Từ liên kết:

    Để có được proxy theo dõi thay đổi, quy tắc cơ bản là lớp của bạn phải công khai, không trừu tượng hoặc không niêm phong. Lớp của bạn cũng phải triển khai các getters / setters ảo công khai cho tất cả các thuộc tính được duy trì. Cuối cùng, bạn phải khai báo các thuộc tính điều hướng mối quan hệ dựa trên bộ sưu tập ICollection<T>. Chúng không thể là một triển khai cụ thể hoặc một giao diện khác xuất phát từ ICollection<T>(một sự khác biệt so với proxy Đang tải chậm)

Một liên kết hữu ích khác mô tả điều này là Yêu cầu của MSDN để tạo Proxy POCO .


52
Không có lý do khác để làm cho các thuộc tính ảo. Thuộc tính điều hướng được đánh dấu là ảo để tải lười biếng và thuộc tính vô hướng được đánh dấu là ảo để theo dõi thay đổi.
Ladislav Mrnka

10
thuộc tính điều hướng là gì và thuộc tính vô hướng là gì?
Abid Ali

9
@AbidAli: Tôi tin rằng một thuộc tính điều hướng là một khóa ngoại (một loại lớp thực thể) hoặc một mối quan hệ với nhiều mối quan hệ (thuộc loại ICollection <>). Thuộc tính vô hướng là một loại cơ sở (int, chuỗi, ..) hoặc ComplexType (chỉ là một cấu trúc của các loại cơ sở).
Scott Stafford

2
Là " public virtual byte[] bigData { get; set; }" lười tải?
AechoLiu

9
byte [] sẽ được tải một cách háo hức, chỉ có khóa ngoại mới có thể lười biếng. Nếu bạn không muốn tìm nạp cột đó, đừng bao giờ lấy toàn bộ bản ghi - chỉ .Select(a=>new { fields you want }).
Scott Stafford

63

Từ khóa ảo này có liên quan đến chủ đề tải dữ liệu từ khung thực thể (tải lười biếng, tải háo hức và tải rõ ràng).

Bạn nên sử dụng từ khóa ảo , khi bạn muốn tải dữ liệu với tải lười biếng.

tải lười biếng là quá trình trong đó một thực thể hoặc bộ sưu tập các thực thể được tự động tải từ cơ sở dữ liệu vào lần đầu tiên được truy cập.

Ví dụ: khi sử dụng lớp thực thể Blog được xác định bên dưới, các Bài đăng liên quan sẽ được tải lần đầu tiên thuộc tính điều hướng Bài viết được truy cập:

public class Blog 
{  
     public int BlogId { get; set; }  
     public string Name { get; set; }  
     public string Url { get; set; }  
     public string Tags { get; set; }  
     public virtual ICollection<Post> Posts { get; set; }  
}

Tải nhanh bộ sưu tập Bài viết có thể được tắt bằng cách làm cho thuộc tính Bài viết không ảo.

nếu tải lười biếng bị tắt, Tải bộ sưu tập Bài viết vẫn có thể đạt được bằng cách tải háo hức (sử dụng phương pháp Bao gồm) hoặc Tải rõ ràng các thực thể liên quan (sử dụng phương thức Tải).

Đang háo hức tải:

using (var context = new BloggingContext()) 
{ 
    // Load all blogs and related posts 
    var blogs1 = context.Blogs 
                          .Include(b => b.Posts) 
                          .ToList(); 
}

Đang tải rõ ràng:

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 

    // Load the posts related to a given blog 
    context.Entry(blog).Collection(p => p.Posts).Load(); 
}

1
Làm cách nào để tránh sự cố N + 1 khi sử dụng ảo (tải chậm)? Ví dụ: bối cảnh.Blogs.ToList (); sau đó nó sẽ không tham gia các bảng và nó sẽ chạy truy vấn chọn nhiều như số lượng blog.
Chuyên gia muốn là

1
@Expertwannabe Ngay cả khi bạn sử dụng tải chậm, bạn vẫn có thể yêu cầu tải một cách rõ ràng với một cuộc gọi đến Include().
Đức ông
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.