EF中有两种类型的实体:POCO Entity和dynamic proxy entity。
POCO class是一个类,它不依赖任何.NET framework的基类,它就像任何其他的普通类一样,这也是为什么被称之为“Plain Old CLR Object”的原因;
这些由实体数据模型生成的POCO实体支持大多数的增删查改的功能。下面是一个Studnet POCO实体:
public class Student { public Student() { this.Courses = new List<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 IList<Course> Courses { get; set; } }
动态代理是POCO实体运行状态下的代理类,它就像POCO实体的包装类,动态包装实体支持懒加载,自动跟踪改变的特性;
一个POCO实体需要满足下面的条件,才可以成为POCO代理
1.必须定义成Public
2.不能是密封的
3.不能是抽象的;
4.导航属性必须定义成public virtual;
5.每个集合属性必须是Icollection<T>;
6.在context类中,ProxyCreationEnabled 这个选项必须不能是false(默认是true);
下面的POCO Student实体满足了上面的条件,它将会在运行的时候成为动态代理实体;
public 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 virtual Standard Standard { get; set; } public virtual StudentAddress StudentAddress { get; set; } public virtual ICollection<Course> Courses { get; set; } }
注意:动态代理默认是对每个实体都是有效的,然而你可以手动禁止动态代理,通过在上下文类中设置ProxyCreationEnabled 这个选项为false,而达到目的;
context.Configuration.ProxyCreationEnabled=false;
在运行的时候Student POCO实体就会变成代理类:
代理类有两个属性,一个标量属性,一个是导航属性,
标量属性实际值包含在实体中,例如Student实体有标量属性StudentID和StudentName,这和数据库中字段一致;
导航属性指向另外相关联的实体,Student实体有一个Standard属性作为导航属性,可以保证程序从一个Student导航到相关联的standard实体。