延迟加载实体框架

时间:2015-04-16 04:41:50

标签: c# entity-framework

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

如果我添加virtual,则Department会加载相关员工。两个类之间没有Inhertence关系。两者都是TPT。

我说this link

  

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

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

2 个答案:

答案 0 :(得分:2)

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

  

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

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

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

答案 1 :(得分:1)

您似乎对代理如何执行此操作感到困惑。

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

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

DbContext.Configuration.ProxyCreationEnabled = false;