Does the virtual
keyword has an effect when used on the properties in EF Code First?. Can someone describe all of its ramifications in different situations?
For instance, I know it can control lazy loading -- if you use the virtual keyword on an ICollection/one-to-many relationship property, it will be lazy-loaded by default, whereas if you leave the virtual keyword out, it will be eager-loaded.
What other effects can virtual
keyword have in EF with POCO entities?. Should I make it default to use virtual
on all my properties, or default to not using it?
So far, I know of these effects.
Another useful link describing this is MSDN\'s Requirements for Creating POCO Proxies.
This virtual keyword is related to the topic of loading data from entity framework (lazy loading, eager loading and explicit loading).
You should use virtual keyword, when you want to load data with lazy loading.
lazy loading is the process whereby an entity or collection of entities is automatically loaded from the database the first time it is accessed.
For example, when using the Blog entity class defined below, the related Posts will be loaded the first time the Posts navigation property is accessed:
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; }
}
Lazy loading of the Posts collection can be turned off by making the Posts property non-virtual.
if lazy loading is off, Loading of the Posts collection can still be achieved using eager loading (using Include method) or Explicitly loading related entities (using Load method).
Eagerly Loading:
using (var context = new BloggingContext())
{
// Load all blogs and related posts
var blogs1 = context.Blogs
.Include(b => b.Posts)
.ToList();
}
Explicitly Loading:
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();
}