Entity Framework- 类型

在Entity Framework中,有两种类型的实体允许开发人员将自己的自定义数据类与数据模型一起使用,而无需对数据类本身进行任何修改.

  • POCO实体

  • 动态代理

POCO实体

  • POCO代表"普通的"CLR对象,可以用作数据模型的现有域对象.

  • 映射到实体的POCO数据类在数据模型中定义.

  • 它也支持大多数相同的查询,插入,更新和删除行为作为实体数据模型工具生成的实体类型.

  • 您可以使用POCO模板从概念模型中生成持久性无知的实体类型.

让我们看看下面的概念实体数据模型示例.

概念实体模型

为上述实体模型生成POCO实体 :

步骤1 : 右键单击设计器窗口.它将显示以下对话框.

设计师窗口

第2步 : 选择添加代码生成项...

代码生成

第3步 : 选择EF 6.x DbContext Generator,写入名称,然后单击Add按钮.

您将在解决方案资源管理器中看到生成POCODemo.Context.tt和POCODemo.tt模板./p> 解决方案资源管理器

POCODemo.Context生成DbContext和对象集您可以返回并用于查询,例如上下文,学生和课程等.

Generate

另一个模板处理学生,课程等所有类型.以下是学生类的代码,它是从实体模型自动生成的.

namespace ConsoleApplication1 {

   using System;
   using System.Collections.Generic;

   public partial class Student {

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2214:DoNotCallOverridableMethodsInConstructors")]

      public Student() {
         this.Enrollments = new HashSet<Enrollment>();
      }

      public int ID { get; set; }
      public string LastName { get; set; }
      public string FirstMidName { get; set; }
      public System.DateTime EnrollmentDate { get; set; }

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         CA2227:CollectionPropertiesShouldBeReadOnly")]

      public virtual ICollection<Enrollment> Enrollments { get; set; }

   }
}

从实体模型为课程和注册表生成类似的类.

动态代理

创建POCO实体类型的实例时,实体框架通常会创建一个动态生成的派生类型的实例,充当代理对于实体.也可以说它是一个运行时代理类,如POCO实体的包装类.

  • 您可以覆盖实体的某些属性,以便在访问属性时自动执行操作.

  • 此机制用于支持延迟加载关系和自动更改跟踪.

  • 此技术也适用于那些模型使用Code First和EF Designer创建的.

如果您希望实体框架支持延迟加载相关对象并且跟踪POCO类中的更改,然后POCO类必须满足以下要求 :

  • 自定义数据类必须声明为公共访问.

  • 不得密封自定义数据类.

  • 自定义数据类不能是抽象的.

  • 自定义数据类必须有一个没有参数的公共或受保护构造函数.

  • 如果希望使用CreateObject方法为POCO实体创建代理,请使用不带参数的受保护构造函数.

  • 调用CreateObject方法不保证代理的创建:POCO类必须遵循本主题中描述的其他要求.

  • 该类无法实现IEntityWithChange跟踪器或IEntityWithRelationships接口,因为代理类实现了这些接口.

  • 必须将ProxyCreationEnabled选项设置为true.

以下示例是动态代理实体类.

public partial class Course {

   public Course() {
      this.Enrollments = new HashSet<Enrollment>();
   }

   public int CourseID { get; set; }
   public string Title { get; set; }
   public int Credits { get; set; }
	
   public virtual ICollection<Enrollment> Enrollments { get; set; }
}

要禁用创建代理对象,请将ProxyCreationEnabled属性的值设置为false.