該虛擬關鍵字與從實體框架(延遲加載,急切加載和顯式加載)加載數據的主題相關。
您應該使用虛擬關鍵字,當你想用延遲加載加載數據。
遲緩裝載是過程,由此實體的實體或集合從所述數據庫中的第一時間被訪問自動加載。
例如,使用下面定義的博客實體類時,相關的帖子將被加載在第一時間的帖子導航屬性被訪問:
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; }
}
的帖子集合的延遲加載可以通過關閉使Posts屬性非虛擬。
如果延遲加載關閉,則可以使用預先加載(使用Include方法)或顯式加載相關實體(使用Load方法)來加載Posts集合。
熱切加載:
using (var context = new BloggingContext())
{
// Load all blogs and related posts
var blogs1 = context.Blogs
.Include(b => b.Posts)
.ToList();
}
明確裝入:
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();
}
沒有其他原因,使性能虛擬。導航屬性在延遲加載時標記爲虛擬,標量屬性標記爲虛擬以進行更改跟蹤。 – 2011-04-08 18:31:25
什麼是導航屬性和什麼是標量屬性? – 2012-07-10 10:30:36
@AbidAli:我相信導航屬性是一個外鍵(一個實體類類型)或一對多關係(ICollection <>類型)。標量屬性是基本類型(int,string,..)或ComplexType(它只是基本類型的結構)。 – 2012-07-18 14:30:54