Search code examples
entity-framework-4ef-code-firstentity-framework-4.1

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


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?


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.