Types of Entity in Entity Framework:

There was four types of Entities in Entity Framework 4.x, 1) EntityObject 2) POCO 3) POCO Proxy (dynamic proxy) 4) Self-Tracking Entities.

Entity Framework 5.0 is limited to POCO entity and Dynamic proxy entity. EntityObject used to be used with ObjectContext, which is now not being used in Entity Framework 5.0.

POCO (Plain Old CLR Object):

POCO class is the class that doesn’t depend on any framework specific base class. It is like any other normal .net class that is why it is called “Plain Old CLR Objects”.

These POCO entities (also known as persistence-ignorant objects) support most of the same query, insert, update, and delete behaviors as entity types that are generated by the Entity Data Model. Please see the following Student POCO class.

    public class Student
        public int StudentID { get; set; }

        public string StudentName{ get; set; }

        public Standard Standard{ get ; set; }

        public StudentAddress StudentAddress{ get ; set; }

        public IList<Course> Courses{ get; set; }


Dynamic Proxy (POCO Proxy):

Dynamic Proxy is a runtime proxy class of POCO entity. POCO entity becomes POCO Proxy entity if it meets certain requirements in order to enable lazy loading and automatic change tracking. It adds some methods at runtime to your POCO class which does instant change tracking and lazy loading stuff.

POCO entity should meet the following requirements to become a POCO proxy:

  1. A custom data class must be declared with public access.
  2. A custom data class must not be sealed (NotInheritable in Visual Basic)
  3. A custom data class must not be abstract (MustInherit in Visual Basic).
  4. ProxyCreationEnabled option should not set to false (default is true) in context class
  5. Each navigation property must be declared as public, virtual

Note: By default dynamic proxy is enabled for every entity. However, you can disable dynamic proxy by setting the ProxyCreationEnabled option to false in context class.

context.Configuration.ProxyCreationEnabled = false;

EDM generates POCO entities which satisfy the above requirements for a dynamic proxy by default. The following is Student POCO class generated by EDM:

    public partial class Student
        public Student()
            this.Courses = new HashSet<Course>();
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public Nullable<int> StandardId { get; set; }
        public  Standard Standard { get; set; }
        public StudentAddress StudentAddress { get; set; }
        public virtual ICollection<Course> Courses { get; set; }

At runtime type of Student will be System.Data.Entity.DynamicProxies.Student as below:

Getting the actual entity type from a dynamic proxy:

You can use ObjectContext.GetObjectType() to find the actual type of dynamic proxy as shown below:

Entity can have two types of properties, Scalar properties and Navigation properties.

Scalar properties:

Scalar properties are properties whose actual values are contained in the entity. For example, Student entity has scalar properties e.g. StudentId, StudentName. These correspond with the Student table columns.

Navigation properties:

Navigation properties are pointers to other related entities. The Student has Standard property as a navigation property that will enable application to navigate from a Student to related Standard entity.