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


    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 实体

     1 public class Student
     2 {
     3     public Student()
     4     {
     5         this.Courses = new List<Course>();
     6     }
     7     
     8     public int StudentID { get; set; }
     9     public string StudentName { get; set; }
    10     public Nullable<int> StandardId { get; set; }
    11     
    12     public Standard Standard { get; set; }
    13     public StudentAddress StudentAddress { get; set; }
    14     public IList<Course> Courses { get; set; }
    15 }
    16         
    View Code

    动态代理 (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实体满足以上所有条件,那么它将成为动态代理实体。

     1  public class Student
     2         {
     3             public Student()
     4             {
     5                 this.Courses = new HashSet<Course>();
     6             }
     7     
     8             public int StudentID { get; set; }
     9             public string StudentName { get; set; }
    10             public Nullable<int> StandardId { get; set; }
    11     
    12             public virtual Standard Standard { get; set; }
    13             public virtual StudentAddress StudentAddress { get; set; }
    14             public virtual ICollection<Course> Courses { get; set; }
    15         }
    View Code

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

    context.Configuration.ProxyCreationEnabled = false;

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

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

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

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

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

    标量属性:

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

    导航属性:

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

  • 相关阅读:
    everything is nothing
    基础算法
    OC 优化目录
    iOS 更改启动视图
    单例--iOS
    OC-Objection 学习笔记之一:简单的开始
    iOS 类库列表
    IOS 上线问题
    OC强弱引用的使用规则
    设置桌面图标
  • 原文地址:https://www.cnblogs.com/Inspire-Yi/p/6234845.html
Copyright © 2020-2023  润新知