zoukankan      html  css  js  c++  java
  • POCO系列之——延迟加载

     当我们进行查询的时候,哪些关系的数据将会被加载到内存呢?所有相关的对象都需要吗?在一些场合可能有意义,例如,当查询的实体仅仅拥有一个相关的子实体,但是,多数情况下,你可能只需要加载部分数据,或者你喜欢的话,加载更多的数据。

        在EF4中支持延迟加载功能,那POCO是否也支持延迟加载呢。这个答案是肯定的。在POCO中支持延迟加载必需完成以下两个步骤:

    1、在需要延迟加载的属性前加上virtual ,该属性的类型可以是任务的集合类型ICOLLOCT<T>或者是0/1..1关联属性。

    例如,更新Category实体类,使之支持延迟加载

    1
    2
    3
    4
    5
    6
    7
    public class Category{  
         public int CategoryID { getset; }   
         public string CategoryName { getset; }   
         public string Description { getset; }  
         public byte[] Picture { getset; }  
         public virtual List<Product> Products { getset; }
         ...

    2、在context构造器中开启延迟加载功能:

    public NorthwindContext() : base("name=NorthwindEntities", "NorthwindEntities")
    {
        ContextOptions.LazyLoadingEnabled = true;
        _categories = CreateObjectSet<Category>();
        _products = CreateObjectSet<Product>();
    }

    由于集合是 POCO 的集合,所以,在访问的时候没有事件发生,EF 通过从你定义的实体派生一个动态的对象,然后覆盖你的子实体集合访问属性来实现。这就是为什么需要标记你的子实体集合属性为 virtual 的原因。

    在工程中进行调试,你会发现实例与你声明的类型不一至

    image

    延迟加载优缺点;

    延迟加载:

    • 非常宽容,因为只在需要的时候加载数据,不需要预先计划
    • 可能因为数据访问的延迟而降低性能,考虑到每访问父实体的子实体时,就需要访问数据库。
  • 相关阅读:
    在项目中运用到的导航高亮
    【转载】IE8 inlineblock容器不撑开问题(利用重绘解决)
    我的博客正式开通
    【转载】响应式网页设计的9条基本原则
    一款不错的在线SVG制作工具
    【转载】前端不为人知的一面前端冷知识集锦
    11.3 Daily Scrum
    11.11 Daily Scrum
    11.7 Daily Scrum(周末暂停两天Daily Scrum)
    11.12 Daily Scrum(保存草稿后忘了发布·····)
  • 原文地址:https://www.cnblogs.com/sylone/p/5549713.html
Copyright © 2011-2022 走看看