Entity Framework 教程——Entity Framework中的实体类型

时间:2024-01-15 23:21:44

Entity Framework中的实体类型 :

在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体。在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种。

POCO Entity (Plain Old CLR Object):

POCO类是不依赖任何框架的类型,如同其他正常的一般类型,我们称之为"Plain Old CLR Objects"(这里不知道怎么翻译,普通的CLR对象?古老的CLR对象?大概意思就是没有什么特殊的对象吧)。

POCO 实体(又名非持久化对象)是又EDM创建出来的支持查询,插入,更新,删除行为的实体类型。下面是一个Student 的 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实体满足一下的条件即为POCO代理:

  1. POCO类必须被声明为public
  2. POCO类不能为密封类
  3. POCO类不能为抽象类
  4. 每一个导航属性必须被声明为public,virtual
  5. 所有集合属性必须是ICollection<T>类型的
  6. 在context 类中不能将ProxyCreationEnabled 设置成false (默认是true)

下面 Student 的POCO实体满足以上所有条件,那么它将成为动态代理实体。

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

注意 : 默认情况下所有实体都允许动态代理,当然你也可以在context类中禁用它。

context.Configuration.ProxyCreationEnabled = false;

EDM默认创建的都是这类代理实体

在运行时Student的类型会变成System.Data.Entity.DynamicProxies.Student

Entity Framework 教程——Entity Framework中的实体类型

从动态代理中获取实际的类型 : 

你可以通过ObjectContext.GetObjectType()方法从动态代理中获取实际的类型

Entity Framework 教程——Entity Framework中的实体类型

实体有两种类型的属性,标量属性和导航属性。

标量属性:

标量属性是实体中包含的实际值。例如,Student 实体中如StudentId 和 StudentName的属性。这些对应Student 表中的列。

导航属性:

导航属性指向其他相关的实体。Student 类中有一个Standard 的导航属性,它使应用程序能通过Student 关系到对应的Standard 实体中。