实体框架4选择性延迟加载属性

时间:2010-07-18 03:50:52

标签: entity-framework ado.net entity-framework-4

是否可以加载不包含某些属性的实体?这个实体的一个属性选择起来很昂贵。我想懒加载这个属性。这可能吗?

4 个答案:

答案 0 :(得分:36)

既然你已经阅读了所有人的回复,我会给你正确答案。 EF不支持延迟加载属性。然而,它确实支持了一个非常强大的概念。它被称为表拆分,您可以将表映射到两个实体。假设数据库中的产品表可以映射到产品实体和ProductDetail实体。然后,您可以将昂贵的字段移动到ProductDetail实体,然后在prodcut和productdetail实体之间创建1..1关联。然后,您可以在需要时延迟加载productdetail关联。 在我的书的性能章节中,我有一个名为的食谱。 13-9。将昂贵的财产转移到另一个实体

希望有所帮助!

Julie Lerman has an article on how to split a table

答案 1 :(得分:6)

使用标量属性,选择性地不加载某个属性的唯一方法是在ESQL或L2E中投影:

var q = from p in Context.People
        select new
        {
            Id = p.Id,
            Name = p.Name // note no Biography
        };

+1丹;懒惰地做这个比预先加载它更糟糕。如果你想控制加载,请明确。

答案 2 :(得分:1)

刺激是正确的,但在使用延迟加载时要小心。您可能遇到性能问题,并且没有意识到属性已在代码中的特定位置加载。这是因为它在您使用属性

时加载数据

我更喜欢使用显式加载。通过这种方式,您可以了解何时加载以及何处加载这是一个链接,给出了LoadProperty http://sankarsan.wordpress.com/2010/05/09/ado-net-entity-framework-data-loading-part-2/

的示例

您也可以使用Include方法预先加载。示例:http://wildermuth.com/2008/12/28/Caution_when_Eager_Loading_in_the_Entity_Framework

答案 3 :(得分:1)

给定对EntityFramework DbSet的查询,其中目标实体包含BigProperty和SmallProperty, 您尝试仅在不将BigProperty加载到内存中时访问SmallProperty:

//this query loads the entire entity returned by FirstOrDefault() in memory
//the execution is deferred during Where; the execution happens at FirstOrDefault
db.BigEntities.Where(filter).FirstOrDefault()?.SmallProperty;

//this query only loads the SmallProperty in memory
//the execution is still deferred during Select; the execution happens at FirstOrDefault
//a subset of properties can be selected from the entity, and only those will be loaded in memory
db.BigEntities.Where(filter).Select(e=>e.SmallProperty).FirstOrDefault();

因此,您可以利用此行为仅查询实际需要它的BigProperty,并使用select语句在其他任何位置显式过滤掉它。

我使用Visual Studio调试诊断工具中的内存使用功能对此进行了测试。