你的位置:首页 > ASP.net教程

[ASP.net教程]EF中的实体类型(EF基础系列篇6)


EF中有两种类型的实体:POCO Entity和dynamic proxy entity。

POCO Entity (Plain Old CLR Object)

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; }    }    

Dynamic Proxy (POCO Proxy):

动态代理是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实体。