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

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

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

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

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

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

更改跟踪也是如此 。

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