Entity Framework 中的实体类型

2025年3月17日 | 阅读 3 分钟

Entity Framework 中有两种类型的实体:POCO 实体动态代理

POCO 实体 (普通旧 CLR 对象)

POCO 实体是一个不依赖于任何框架特定基类的类。它就像任何其他普通的 .NET CLR 类; 这就是它被称为“普通旧 CLR 对象”的原因。 POCO 实体在 EF6 和 EF Core 中都受支持。

这些 POCO 实体(也称为持久性无关对象)支持与由实体数据模型生成的实体类型相同的大部分查询插入、更新和删除行为。

这是 Student POCO 实体的示例。

动态代理实体 (POCO 代理)

动态代理是一个运行时代理类,它封装了 POCO 实体。 动态代理实体允许延迟加载

POCO 实体应满足以下要求才能成为 POCO 代理。

  1. POCO 类必须使用 public 访问权限声明。
  2. POCO 类不能是抽象的(Must Inherit Visual Basic)。
  3. POCO 类不能是密封的 (NotInheritable Visual Basic)。
  4. 每个集合属性必须是 ICollection.
  5. 每个导航属性必须声明为 public, virtual。
  6. ProxyCreationEnabled 选项在上下文类中必须不为 false。

以下 POCO 实体满足上述所有要求,以便在运行时成为动态代理实体。

在运行时,Entity Framework API 将为上述 Student 实体创建一个动态代理的实例。 Students 的动态代理类型将是 System.Data.Entity.DynamicProxies.Student,如下所示

Types of Entities in Entity Framework

我们使用 ObjectContext.GetObjectType() 查找动态代理封装的类型,如下所示

Types of Entities in Entity Framework

EntityFramework 中的 EntityState

Entity Framework API 在其生命周期内维护每个实体的状态。 每个实体都有一个状态,该状态基于上下文类对其执行的操作。 实体状态由枚举 System.Data.Entity.EntityState 在 EF6 中表示,在 EF Core 中由 Microsoft.EntityFrameworkCore.EntityState 表示,具有以下值

  • 已添加
  • 已修改
  • 已删除
  • 未更改
  • 已分离

当我们从数据库中检索所有对象时,上下文不仅保存所有对象的引用,还跟踪实体的状态并维护对实体属性所做的修改。 此功能称为更改跟踪。

实体状态从未更改为已修改状态的更改是仅由上下文自动处理的状态。 所有其他更改都必须使用 DbContext 或 DbSet 的适当方法显式进行。

Entity Framework API 构建并执行 INSERT、UPDATE 和 DELETE 命令,这些命令基于在调用 context.SaveChanges() 方法时实体的状态。 它执行 INSERT 命令以添加状态的实体,使用 UPDATE 命令来修改状态的实体,以及使用 DELETE 命令删除状态的实体。 上下文不会跟踪 Detached 状态的实体。