2016-11-21 111 views
1
public virtual Student Student {get; set;} 

为什么外键约束需要标记为虚拟?我看过虚拟和虚拟虚拟的例子。有关系吗?为什么EF Code First中的外键标记为虚拟?

+1

可能重复[虚拟关键字可以在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

回答

1

通过查看此: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; 

将取消虚拟效果。

+0

谢谢,那非常直截了当。 –