我从数据库第一种方法开始,在Employee和Department之间有多对一的关系。实体框架创建了两个部分类:Department
具有Employee
和Employee
的集合,具有单个对象Department
。
如果我添加virtual
,则Department
会加载相关员工。两个类之间没有Inhertence关系。两者都是TPT。
我说this link说
通过创建派生代理类型的实例来实现延迟加载 然后重写虚拟属性以添加加载钩子。
那怎么回事? Department
不是Employee
的父级。
答案 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;