gpt4 book ai didi

entity-framework - 为什么 EF Code First 中的外键标记为虚拟?

转载 作者:行者123 更新时间:2023-12-04 07:23:34 27 4
gpt4 key购买 nike

public virtual Student Student {get; set;}

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

最佳答案

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

我会说:

1. 如果您声明您的属性(property)是虚拟的:

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

这称为延迟加载。

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

您的属性将(默认情况下)与主实体中的所有其他属性一起加载。这意味着您的属性(property)将准备好访问:它已经被检索。实体将不必再次查询数据库,因为您访问了此属性。

这称为急切加载。

我的意见:

我更经常选择急切加载(非虚拟),因为在大多数情况下,我需要使用每个实体的每个属性而不必查询(如果您真的希望所有内容都快的话,速度会更快)但是如果您访问此属性只是偶尔一次(您没有列出任何内容),并且您更频繁地需要除此之外的其余信息,然后将其设为虚拟,这样该属性就不会因为少数访问而减慢查询的其余部分。

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

示例:

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

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;

关于entity-framework - 为什么 EF Code First 中的外键标记为虚拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40729137/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com