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.
virtual
ICollections will be lazy-loaded unless you specifically mark them otherwise.More efficient change tracking. If you meet all the following requirements then your change tracking can use a more efficient method by hooking your virtual properties. From the link:
To get change tracking proxies, the basic rule is that your class must be public, non-abstract or non-sealed. Your class must also implement public virtual getters/setters for all properties that are persisted. Finally, you must declare collection based relationship navigation properties as
ICollection<T>
only. They cannot be a concrete implementation or another interface that derives fromICollection<T>
(a difference from the Deferred Loading proxy)
Another useful link describing this is MSDN's Requirements for Creating POCO Proxies.