📜  Entity Framework-类型

📅  最后修改于: 2020-11-21 07:15:19             🧑  作者: Mango


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

  • POCO实体
  • 动态代理

POCO实体

  • POCO代表“普通的” CLR对象,可以将其用作数据模型中的现有域对象。

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

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

  • 您可以使用POCO模板从概念模型生成对持久性不了解的实体类型。

让我们看一下以下概念实体数据模型示例。

概念实体模型

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

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

设计器窗口

步骤2-选择添加代码生成项…

代码生成

步骤3-选择EF 6.x DbContext Generator,输入名称,然后单击添加按钮。

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

解决方案资源管理器

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

生成

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

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

      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 Enrollments { get; set; }

   }
}

从实体模型为“课程”和“注册”表生成了类似的类。

动态代理

在创建POCO实体类型的实例时,实体框架通常会创建动态生成的派生类型的实例,以作为实体的代理。 IT也可以说是像POCO实体的包装器类那样的运行时代理类。

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

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

  • 该技术也适用于使用Code First和EF Designer创建的模型。

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

  • 自定义数据类必须声明为具有公共访问权限。

  • 自定义数据类不能被密封。

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

  • 自定义数据类必须具有不带参数的公共或受保护的构造函数。

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

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

  • 该类无法实现IEntityWithChangeTracker或IEntityWithRelationships接口,因为代理类实现了这些接口。

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

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

public partial class Course {

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

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

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