Entity framework 4 virtual关键字在Entity Framework 4.1 POCO代码中首先会产生什么影响?
在EF code First中的属性上使用Entity framework 4 virtual关键字在Entity Framework 4.1 POCO代码中首先会产生什么影响?,entity-framework-4,ef-code-first,entity-framework-4.1,Entity Framework 4,Ef Code First,Entity Framework 4.1,在EF code First中的属性上使用virtual关键字是否有效?。有人能描述它在不同情况下的所有后果吗 例如,我知道它可以控制--如果您在ICollection/one-to-many关系属性上使用virtual关键字,默认情况下它将延迟加载,而如果您不使用virtual关键字,它将立即加载 virtual关键字在具有POCO实体的EF中还有哪些其他效果?。我应该默认在我的所有属性上使用virtual,还是默认不使用它?到目前为止,我知道这些效果 :任何virtuali集合都将延迟加载
virtual
关键字是否有效?。有人能描述它在不同情况下的所有后果吗
例如,我知道它可以控制--如果您在ICollection/one-to-many关系属性上使用virtual关键字,默认情况下它将延迟加载,而如果您不使用virtual关键字,它将立即加载
virtual
关键字在具有POCO实体的EF中还有哪些其他效果?。我应该默认在我的所有属性上使用virtual
,还是默认不使用它?到目前为止,我知道这些效果
- :任何
i集合都将延迟加载,除非您特别标记它们virtual
- 。如果您满足以下所有要求,那么您的更改跟踪可以通过挂接虚拟属性来使用更有效的方法。从链接:
要获取更改跟踪代理,请
基本规则是你们的班级必须
公开、非抽象或非密封。
您的类还必须实现public
适用于所有人的虚拟getter/setter
持久化的属性。
最后,您必须声明集合
基于关系的导航
属性仅为
。 它们不可能是混凝土 实现或其他接口 源于i集合
(a 与延迟加载的差异 (代理)i收集
描述这一点的另一个有用链接是MSDN。这个虚拟关键字与从实体框架加载数据的主题相关(延迟加载、急切加载和显式加载) 当您希望以延迟加载方式加载数据时,应该使用virtual关键字 延迟加载是指第一次访问数据库时自动从数据库加载实体或实体集合的过程 例如,当使用下面定义的Blog实体类时,第一次访问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; }
}
显式加载:
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();
}
没有其他理由将属性设置为虚拟。导航属性标记为虚拟用于延迟加载,标量属性标记为虚拟用于更改跟踪。什么是导航属性,什么是标量属性?@AbidAli:我认为导航属性是外键(实体类类型)或一对多关系(ICollection类型)。标量属性是基类型(int,string,…)或ComplexType(只是基类型的结构)。是“
public virtual byte[]bigData{get;set;}
”延迟加载?字节[]将被紧急加载,只有外键可以延迟。如果您不想获取该列,请不要获取整个记录-只需。选择(a=>new{fields your want})
。如何在使用虚拟(延迟加载)时避免N+1问题?例如,context.Blogs.ToList();然后它将不连接表,并将运行与博客数量相同的select查询。@ExpertWannab即使使用延迟加载,也可以通过调用Include()
显式请求快速加载。