【发布时间】:2010-07-18 03:50:52
【问题描述】:
是否可以加载不包括某些属性的实体?该实体的属性之一选择起来很昂贵。我想延迟加载这个属性。这可能吗?
【问题讨论】:
标签: entity-framework ado.net entity-framework-4
是否可以加载不包括某些属性的实体?该实体的属性之一选择起来很昂贵。我想延迟加载这个属性。这可能吗?
【问题讨论】:
标签: entity-framework ado.net entity-framework-4
既然您已经阅读了大家的回复,我将给您正确的答案。 EF 不支持延迟加载属性。然而,它确实支持一个非常强大的概念然后这个。这称为表拆分,您可以将表映射到两个实体。假设数据库中的一个产品表可以映射到产品实体和ProductDetail实体。然后,您可以将昂贵的字段移动到 ProductDetail 实体,然后在 prodcut 和 productdetail 实体之间创建 1..1 关联。然后,您可以仅在需要时才延迟加载 productdetail 关联。 在我书中的表演章节中,我有一个名为的食谱。 13-9。将昂贵的财产转移到另一个实体
希望有帮助!
【讨论】:
对于标量属性,选择性地不加载某个属性的唯一方法是在 ESQL 或 L2E 中进行投影:
var q = from p in Context.People
select new
{
Id = p.Id,
Name = p.Name // note no Biography
};
+1 给丹;懒惰地这样做比预先加载它更糟糕。如果你想控制加载,请明确。
【讨论】:
stimms 是正确的,但在使用延迟加载时要小心。您可能会遇到性能问题,并且没有意识到该属性正在代码中的特定位置加载。这是因为它会在您使用该属性时加载数据
我更喜欢使用显式加载。这样您就可以知道它们何时加载以及在何处加载。这是一个链接,它给出了 LoadProperty http://sankarsan.wordpress.com/2010/05/09/ado-net-entity-framework-data-loading-part-2/ 的示例
您也可以使用 Include 方法进行 Eager Loading。此处示例:http://wildermuth.com/2008/12/28/Caution_when_Eager_Loading_in_the_Entity_Framework
【讨论】:
鉴于对 EntityFramework DbSet 的查询,其中目标实体包含 BigProperty 和 SmallProperty, 当你试图只访问 SmallProperty 而不将 BigProperty 加载到内存中时:
//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 调试诊断工具中的内存使用功能对此进行了测试。
【讨论】: