15

为什么我们在声明导航属性时需要使用“virtual”关键字?我了解 Code First 框架以某种方式使用它来识别该属性是导航属性,但我想知道如何。具体来说,我想知道它与 MSDN 文档中对“虚拟”关键字的描述有何关系:http: //msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80) .aspx

4

2 回答 2

13

在运行时,实体框架将为您生成所谓的代理实体。这些实体是从您的实体类型派生的动态创建类型的对象。

这允许您将实体用作POCO,这是一个简单的对象,与 Entity Framework 没有任何关系,因为它不继承自EntityObject.

在运行时,动态创建的实体类型从您的 POCO 继承,并覆盖您的所有虚拟属性以添加允许在属性 getter 中延迟加载的实体框架内容。

延迟加载是一个复杂的过程,需要您的代码了解数据如何来自数据库。由于您不希望您的域类了解数据库和 EF 内容,因此您从 EF 中抽象出您的实体并添加虚拟属性,因此 EF 可以覆盖您的基本 POCO 并在运行时添加其与 DB 相关的内容。

更改跟踪也是如此。

于 2013-01-14T15:59:20.990 回答
1

添加virtual允许 EF 生成一个派生类,该类覆盖该属性并从数据库返回一个集合。

于 2013-01-14T15:14:06.170 回答