C#EF Code First虚拟关键字,它有什么作用?

时间:2013-01-14 15:12:10

标签: c# .net entity-framework ef-code-first

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

2 个答案:

答案 0 :(得分:13)

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

这允许您将实体用作 POCO ,这是一个与Entity Framework无关的简单对象,因为它不会从EntityObject继承。

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

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

change tracking相同。

答案 1 :(得分:1)

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