- 实体框架教程
- 实体框架 - 首页
- 实体框架 - 概述
- 实体框架 - 架构
- 实体框架 - 环境设置
- 实体框架 - 数据库设置
- 实体框架 - 数据模型
- 实体框架 - DbContext
- 实体框架 - 类型
- 实体框架 - 关系
- 实体框架 - 生命周期
- 实体框架 - 代码优先方法
- 实体框架 - 模型优先方法
- 实体框架 - 数据库优先方法
- 实体框架 - 开发方法
- 实体框架 - 数据库操作
- 实体框架 - 并发
- 实体框架 - 事务
- 实体框架 - 视图
- 实体框架 - 索引
- 实体框架 - 存储过程
- 实体框架 - 脱机实体
- 实体框架 - 表值函数
- 实体框架 - 原生 SQL
- 实体框架 - 枚举支持
- 实体框架 - 异步查询
- 实体框架 - 持久化
- 实体框架 - 投影查询
- 实体框架 - 命令日志
- 实体框架 - 命令拦截
- 实体框架 - 空间数据类型
- 实体框架 - 继承
- 实体框架 - 迁移
- 实体框架 - 渴望加载
- 实体框架 - 延迟加载
- 实体框架 - 显式加载
- 实体框架 - 验证
- 实体框架 - 跟踪更改
- 实体框架 - 彩色实体
- 实体框架 - 代码优先方法
- 实体框架 - 第一个示例
- 实体框架 - 数据注释
- 实体框架 - Fluent API
- 实体框架 - 填充数据库
- 实体框架 - 代码优先迁移
- 实体框架 - 多个 DbContext
- 实体框架 - 嵌套实体类型
- 实体框架资源
- 实体框架 - 快速指南
- 实体框架 - 有用资源
- 实体框架 - 讨论
实体框架 - 类型
在实体框架中,有两种类型的实体允许开发人员将他们自己的自定义数据类与数据模型一起使用,而无需对数据类本身进行任何修改。
- POCO 实体
- 动态代理
POCO 实体
POCO 代表“普通旧”CLR 对象,可以用作现有域对象与您的数据模型。
映射到实体的 POCO 数据类在数据模型中定义。
它还支持与实体数据模型工具生成的实体类型相同的查询、插入、更新和删除行为。
您可以使用 POCO 模板从概念模型生成与持久性无关的实体类型。
让我们看一下以下概念实体数据模型示例。
为上述实体模型生成 POCO 实体 -
步骤 1 - 右键单击设计器窗口。它将显示以下对话框。
步骤 2 - 选择“添加代码生成项...”
步骤 3 - 选择 EF 6.x DbContext 生成器,写入名称,然后单击“添加”按钮。
您将在解决方案资源管理器中看到已生成的 POCODemo.Context.tt 和 POCODemo.tt 模板。
POCODemo.Context 生成 DbContext 和您可以返回并用于查询的对象集,例如上下文、学生和课程等。
另一个模板处理所有类型 Student、Courses 等。以下是从实体模型自动生成的 Student 类的代码。
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; }
}
}
从实体模型为 Course 和 Enrollment 表生成类似的类。
动态代理
在创建 POCO 实体类型的实例时,实体框架通常会创建动态生成的派生类型的实例,该实例充当实体的代理。也可以说它是一个运行时代理类,就像 POCO 实体的包装器类一样。
您可以覆盖实体的某些属性以在访问属性时自动执行操作。
此机制用于支持关系的延迟加载和自动更改跟踪。
此技术也适用于使用代码优先和 EF 设计器创建的那些模型。
如果您希望实体框架支持相关对象的延迟加载并跟踪 POCO 类中的更改,则 POCO 类必须满足以下要求 -
自定义数据类必须声明为公共访问。
自定义数据类不能被密封。
自定义数据类不能是抽象的。
自定义数据类必须具有不带参数的公共或受保护的构造函数。
如果您希望使用 CreateObject 方法为 POCO 实体创建代理,请使用不带参数的受保护构造函数。
调用 CreateObject 方法不能保证创建代理:POCO 类必须遵循本主题中描述的其他要求。
该类不能实现 IEntityWithChangeTracker 或 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。