- 实体框架教程
- 实体框架 - 主页
- 实体框架 - 概述
- 实体框架 - 架构
- 实体 F - 环境设置
- 实体框架 - 数据库设置
- 实体框架 - 数据模型
- 实体框架-DbContext
- 实体框架 - 类型
- 实体框架 - 关系
- 实体框架 - 生命周期
- 实体 F - 代码优先方法
- 实体 F - 模型优先方法
- 实体 F - 数据库优先方法
- 实体框架 - DEV 方法
- 实体F——数据库操作
- 实体框架 - 并发
- 实体框架 - 事务
- 实体框架 - 视图
- 实体框架 - 索引
- 实体 F - 存储过程
- 实体 F - 断开连接的实体
- 实体 F - 表值函数
- 实体框架 - 本机 SQL
- 实体框架 - 枚举支持
- 实体F - 异步查询
- 实体框架 - 持久性
- 实体 F - 投影查询
- 实体 F - 命令记录
- 实体F——命令拦截
- 实体框架 - 空间数据类型
- 实体框架 - 继承
- 实体框架 - 迁移
- 实体框架 - 预加载
- 实体框架 - 延迟加载
- 实体框架 - 显式加载
- 实体框架 - 验证
- 实体框架 - 跟踪更改
- 实体框架 - 彩色实体
- 实体 F - 代码优先方法
- 实体框架 - 第一个示例
- 实体框架 - 数据注释
- 实体框架 - 流畅的 API
- 实体框架-种子数据库
- 实体 F - 代码优先迁移
- 实体 F - 多个 DbContext
- 实体 F - 嵌套实体类型
- 实体框架资源
- 实体框架 - 快速指南
- 实体框架 - 有用的资源
- 实体框架 - 讨论
实体框架 - 类型
在实体框架中,有两种类型的实体,允许开发人员将自己的自定义数据类与数据模型一起使用,而无需对数据类本身进行任何修改。
- POCO实体
- 动态代理
POCO实体
POCO 代表“普通”CLR 对象,可以用作数据模型的现有域对象。
映射到实体的 POCO 数据类在数据模型中定义。
它还支持与实体数据模型工具生成的实体类型相同的大多数查询、插入、更新和删除Behave。
您可以使用 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<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 实体类型的实例时,实体框架通常会创建动态生成的派生类型的实例,该派生类型充当实体的代理。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<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。