public virtual Student Student {get; set;}
为什么外键约束需要标记为虚拟?我看过虚拟和虚拟虚拟的例子。有关系吗?为什么EF Code First中的外键标记为虚拟?
public virtual Student Student {get; set;}
为什么外键约束需要标记为虚拟?我看过虚拟和虚拟虚拟的例子。有关系吗?为什么EF Code First中的外键标记为虚拟?
通过查看此:https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx以及@Shoes在评论中提供的链接。
我会这样说:
1.如果你申报你的财产的虚拟:
你的虚拟财产(默认)将查询的主要对象时,不会立即加载。只有尝试访问数据库或访问其中的某个组件时,它才会从数据库中进行检索。
这就是所谓的延迟加载。
2.如果你声明它非虚:
你的财产将(默认),可以用在您的主实体上所有的其他财产一起马上加载。这意味着您的财产将准备好访问:它已被撤回。因为您访问此属性,实体将不必再次查询数据库。
这被称为热切加载。
我的看法:
更多的时候我选择热切加载(非虚拟的),因为大部分的时间,我需要每一个实体的每一个属性,而不必查询返回(在快一起使用如果你只是偶尔访问这个属性(你没有列出任何东西),而且你希望更多的时候只是其余的信息不用这个,那么就让它变成虚拟的,这样这个属性不会变慢查询的其余部分仅用于一些访问。
希望这是明确的......
Exemples:
在哪里,我不会使用虚拟(急切地):
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
}
最后一件事:
如果您不查询1000行以上的数据库,那么无论您选择什么都不会有很大的影响。另外,你可以声明这些虚拟财产,如果你想测试周围的其他方式,你就必须做到这一点:
context.LazyLoadingEnabled = false;
将取消虚拟效果。
谢谢,那非常直截了当。 –
可能重复[虚拟关键字可以在Entity Framework 4.1 POCO代码优先?](http:// stackoverflow。com/questions/5597760/what-effects-can-the-virtual-keyword-have-in-entity-framework-4-1-poco-code-fi) – Shoe