virtual
关键字在EF Code First中的属性上使用时有影响吗?能否描述不同情况下它的全部影响?
例如,我知道它可以控制延迟加载 - 如果在ICollection/一对多关系属性上使用虚拟关键字,则默认情况下将进行延迟加载,而如果省略虚拟关键字,则将进行急切加载。
virtual
关键字在EF中与POCO实体有哪些其他影响?我应该默认使用virtual
在所有属性上,还是默认不使用它?
virtual
关键字在EF Code First中的属性上使用时有影响吗?能否描述不同情况下它的全部影响?
例如,我知道它可以控制延迟加载 - 如果在ICollection/一对多关系属性上使用虚拟关键字,则默认情况下将进行延迟加载,而如果省略虚拟关键字,则将进行急切加载。
virtual
关键字在EF中与POCO实体有哪些其他影响?我应该默认使用virtual
在所有属性上,还是默认不使用它?
到目前为止,我所知道的这些影响如下。
virtual
ICollections 都会被延迟加载。更高效的更改跟踪。如果您满足以下所有要求,则更改跟踪可以通过挂接虚拟属性来使用更有效的方法。来自链接:
要获得更改跟踪代理,基本规则是您的类必须是公共的、非抽象或非密封的。您的类还必须为持久化的所有属性实现公共虚拟 getter/setter。最后,您必须将基于集合的关系导航属性声明为仅限
ICollection<T>
。它们不能是具体实现或从ICollection<T>
派生的另一个接口(与Deferred Loading代理的不同)。
另一个有用的链接是 MSDN 的 创建 POCO 代理的要求。
这个虚拟关键字与从实体框架(延迟加载、急切加载和显式加载)中加载数据的主题有关。
当你想使用延迟加载方式加载数据时,应该使用virtual关键字。
延迟加载是指在第一次访问实体或实体集合时自动从数据库中加载实体或实体集合的过程。
例如,当使用下面定义的Blog实体类时,相关的Posts将在第一次访问Posts导航属性时被加载:
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public string Tags { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
通过使Posts属性非虚拟,可以关闭对文章集合的惰性加载。
如果关闭了惰性加载,则可以使用急切加载(使用Include方法)或显式加载相关实体(使用Load方法)来加载文章集合。
急切加载:
using (var context = new BloggingContext())
{
// Load all blogs and related posts
var blogs1 = context.Blogs
.Include(b => b.Posts)
.ToList();
}
显式加载:
using (var context = new BloggingContext())
{
var blog = context.Blogs.Find(1);
// Load the posts related to a given blog
context.Entry(blog).Collection(p => p.Posts).Load();
}
Include()
来显式请求急切加载。 - Monsignor
public virtual byte[] bigData { get; set; }
" 是延迟加载吗? - AechoLiu.Select(a=>new { fields you want })
选择您需要的字段。 - Scott Stafford