What effect(s) can the virtual keyword have in Entity Framework 4.1 POCO Code First?

ef-code-first, entity-framework-4, entity-framework-4.1

Solution

So far, I know of these effects.

- Lazy Loading: Any `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 from `ICollection<T>` (a difference from the Deferred Loading proxy)

Another useful link describing this is MSDN's Requirements for Creating POCO Proxies.

Problem

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?

Original source