Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 4 virtual关键字在Entity Framework 4.1 POCO代码中首先会产生什么影响?_Entity Framework 4_Ef Code First_Entity Framework 4.1 - Fatal编程技术网

Entity framework 4 virtual关键字在Entity Framework 4.1 POCO代码中首先会产生什么影响?

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集合都将延迟加载

在EF code First中的属性上使用
virtual
关键字是否有效?。有人能描述它在不同情况下的所有后果吗

例如,我知道它可以控制--如果您在ICollection/one-to-many关系属性上使用virtual关键字,默认情况下它将延迟加载,而如果您不使用virtual关键字,它将立即加载


virtual
关键字在具有POCO实体的EF中还有哪些其他效果?。我应该默认在我的所有属性上使用
virtual
,还是默认不使用它?

到目前为止,我知道这些效果

  • :任何
    virtual
    i集合都将延迟加载,除非您特别标记它们
  • 。如果您满足以下所有要求,那么您的更改跟踪可以通过挂接虚拟属性来使用更有效的方法。从链接:

    要获取更改跟踪代理,请 基本规则是你们的班级必须 公开、非抽象或非密封。 您的类还必须实现public 适用于所有人的虚拟getter/setter 持久化的属性。 最后,您必须声明集合 基于关系的导航 属性仅为
    i集合
    。 它们不可能是混凝土 实现或其他接口 源于
    i收集
    (a 与延迟加载的差异 (代理)


描述这一点的另一个有用链接是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()
显式请求快速加载。