为什么在声明导航属性时我们确实需要使用“virtual”关键字?我知道Code First框架以某种方式使用它来识别属性是导航属性,但我想知道如何。具体来说,我想知道它与MSDN文档中针对“虚拟”关键字的描述有何关联:http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx
答案 0 :(得分:13)
在运行时,Entity Framework将为您生成所谓的代理实体。这些实体是动态创建的类型的对象,这些类型派生自您的实体类型。
这允许您将实体用作 POCO ,这是一个与Entity Framework无关的简单对象,因为它不会从EntityObject
继承。
在运行时,动态创建的实体类型继承自您的POCO,并覆盖所有虚拟属性,以添加允许在属性getter中进行延迟加载的Entity Framework内容。
延迟加载是一个复杂的过程,需要您的代码知道数据是如何来自数据库的。由于您不希望您的域类了解数据库和EF内容,因此您可以从EF中抽象实体并添加虚拟属性,因此EF可以覆盖您的基本POCO并在运行时添加与DB相关的内容。
答案 1 :(得分:1)
添加virtual
允许EF生成一个派生类,该类覆盖该属性并从数据库返回一个集合。