【问题标题】:Why are foreign keys in EF Code First marked as virtual?为什么EF Code First中的外键标记为虚拟?
【发布时间】:2017-04-05 09:03:27
【问题描述】:
public virtual Student Student {get; set;}

为什么需要将外键约束标记为虚拟?我见过虚拟和缺乏虚拟的例子。有关系吗?

【问题讨论】:

标签: entity-framework ef-code-first


【解决方案1】:

通过查看:https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx,以及 @Shoes 在 cmets 中提供的链接。

我会这样说:

1.如果你声明你的财产是虚拟的:

查询主对象时,您的虚拟属性(默认情况下)不会立即加载。仅当您尝试访问它或访问其中一个组件时,它才会从数据库中检索。

这就是所谓的延迟加载。

2。如果你声明它是非虚拟的:

您的属性将(默认情况下)与主实体中的所有其他属性一起立即加载。这意味着您的财产将可以访问:它已经被取回。实体不必再次查询数据库,因为您访问了此属性。

这称为急切加载。

我的看法:

更多时候我选择热切加载(非虚拟),因为大多数时候,我需要使用每个实体的每个属性而无需查询(如果你真的想要一切都快,则更快)但是如果你仅偶尔访问此属性一次(您没有列出任何内容)并且您更频繁地想要除此之外的其余信息,然后将其设为虚拟,因此此属性不会仅在少数情况下减慢查询的其余部分访问。

希望这很清楚......

示例:

我不会使用虚拟的地方(急切地):

foreach(var line in query)
{
    var v = line.NotVirtual; // I access the property for every line
}

我会在哪里使用虚拟或延迟加载:

foreach(var line in query)
{
    if(line.ID == 509)        // because of this condition
    var v = line.Virtual; // I access the property only once in a while
}

最后一件事:

如果您不查询超过 1 000 行的数据库,那么无论您选择什么都不会产生很大的影响。此外,您可以将这些属性声明为虚拟,如果您想反过来测试,您只需这样做(实体 4.0):

context.LazyLoadingEnabled = false;

它会取消虚拟效果。

编辑

对于较新版本的 EF:

WhateverEntities db = new WhateverEntities() 
db.Configuration.LazyLoadingEnabled = false;

【讨论】:

  • 谢谢,这很简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2013-10-21
相关资源
最近更新 更多