猿教程 Logo

实体类型

在前一节中我们已经对现有数据库创建了EDM。 你可以看到,EDM包含数据库中的每个表的实体。 在实体框架5.0/6.0中有两种实体类型:POCO实体和动态代理实体。


POCO实体(Plain Old CLR Object)

POCO类是不依赖于任何特定的框架基类的类,就像其他普通的.net类一样,这就是为什么它被称为"Plain Old CLR Objects”。

这些POCO实体作为实体数据模型EDM生成的实体类型,支持相同的查询、插入、更新和删除行为。 下面是一个例子,学生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 Proxy)

动态代理是POCO实体运行状态下的代理类,它就像POCO实体的包装类,动态包装实体支持懒加载,自动跟踪改变的特性;

一个POCO实体需要满足下面的条件,才可以成为POCO代理

1.必须定义成Public

2.不能是密封的

3.不能是抽象的;

4.导航属性必须定义成public virtual;

5.每个集合属性必须是Icollection

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

注意: 一般情况下Entity Framework为每个实体默认启用动态代理。 然而,您可以通过在上下文类中设置ProxyCreationEnabled选项为false来禁用动态代理。

context.Configuration.ProxyCreationEnabled = false;

设置后,EDM生成的POCO实体将满足上述要求。


如果开启动态代理,在运行时,Student类将生成System.Data.Entity.DynamicProxies.Student。 如下:



从动态代理获得实体类型

您可以使用ObjectContext.GetObjectType()获取到动态代理的实际类型,如下所示:


代理类有两个属性,一个标量属性,一个是导航属性,

标量属性:

标量属性实际值包含在实体中,例如Student实体有标量属性StudentID和StudentName,这和数据库中字段一致;

导航属性:

导航属性指向另外相关联的实体,Student实体有一个Standard属性作为导航属性,可以保证程序从一个Student导航到相关联的standard实体。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/entity/entitytypes.html