Entity Framework中实体的类型
Entity Framework中有两种类型的实体:POCO实体和动态代理实体。
POCO实体(普通CLR对象)
POCO实体是一个不依赖于任何特定于框架的类。它就像任何其他正常的.net CLR类,这就是为什么它被称为“普通CLR对象”。
EF 6和EF Core都支持POCO实体。
这些POCO实体(也称为不了解持久性的对象)支持与实体数据模型生成的实体类型相同的大多数查询、插入、更新和删除行为。下面是Student POCO实体的示例。
//就是一个最简单最普通的实体类。没有被纳入 Entity Framewor上下文管理范围内
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public DateTime? DateOfBirth { get; set; }
public byte[] Photo { get; set; }
public decimal Height { get; set; }
public float Weight { get; set; }
public StudentAddress StudentAddress { get; set; }
public Grade Grade { get; set; }
}
动态代理实体(POCO代理)
动态代理是一个运行时代理类,它包装POCO实体。动态代理实体允许延迟加载。
注意:动态代理实体仅在EF 6中支持。EF Core 2.0还不支持。
POCO实体需要满足以下条件才能成为POCO代理:
1、POCO类必须声明为具有公共访问权(public)。
2、POCO类不能被密封(在Visual Basic中不可继承)。
3、POCO类不能是抽象的(Visual Basic中的MustInherit)。
4、每个导航属性必须声明为public、virtual。
5、每个集合属性必须为ICollection。
6、ProxyCreationEnabled选项在上下文类中不能为false(默认为true)。
下面的POCO实体满足在运行时成为动态代理实体的所有上述要求。
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public DateTime? DateOfBirth { get; set; }
public byte[] Photo { get; set; }
public decimal Height { get; set; }
public float Weight { get; set; }
public virtual StudentAddress StudentAddress { get; set; }
public virtual Grade Grade { get; set; }
}
注:默认情况下,每个实体都启用动态代理。但是,你可以通过设置context.Configuration.ProxyCreationEnabled = false禁用动态代理;在context类中。
在运行时,EF API将为上述Student实体创建一个动态代理实例。Student的动态代理类型为System.Data.Entity.DynamicProxies. Student,如下图所示:
使用ObjectContext.GetObjectType()通过动态代理找到底层的包装类型,如下所示:
参考
https://www.entityframeworktutorial.net/
https://msdn.microsoft.com/