延迟加载实体框架



我从数据库优先方法开始,员工和部门之间有多对一的关系。实体框架创建了两个分部类:Department具有Employee集合和Employee具有单个对象Department

如果我添加了virtual那么Department加载相关员工。两个类之间没有内在关系。两者都是TPT。

我得到这个链接说

延迟加载是通过创建派生代理类型的实例来实现的 然后覆盖虚拟属性以添加加载钩子。

那么这是怎么回事呢? Department不是Employee的父级。

实体框架导航属性的工作方式有所不同,具体取决于您使用的是数据库优先方法还是代码优先方法。以下是您发布的链接中的扩展代码段:

使用 POCO 实体类型时,延迟加载是通过创建派生代理类型的实例,然后重写虚拟属性以添加加载挂钩来实现的。

"

POCO"的意思是"普通的旧 CLR 对象",这是您将在代码优先方法中创建的类。 由于这些类没有任何固有的 EF 知识,因此必须以 EF 代理可以正确连接它们的方式定义属性。

由于您使用的是数据库优先,因此这些类不是"POCO"。它们继承自实体框架基类,该基类连接导航属性以进行延迟加载。

您似乎对代理如何做到这一点感到困惑。

因此,当您使用 Department 实例加载 employee.Department 属性时,实例employee不属于 Employee 类型,而是 EF 生成并从Employee类继承的proxy class类型。 允许代理类型重写 Employee 类中的 Department 属性,并且该属性的 get 方法触发数据库查询以将部门实例加载到内存中。

但是,您也可以禁用代理创建的行为。

DbContext.Configuration.ProxyCreationEnabled = false;

最新更新