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

Entity framework 实体框架4选择性延迟加载属性,entity-framework,ado.net,entity-framework-4,Entity Framework,Ado.net,Entity Framework 4,是否可以加载不包含某些属性的实体?此实体的一个属性选择起来很昂贵。我想延迟加载此属性。这可能吗?stimms是正确的,但是在使用延迟加载时要小心。您可能存在性能问题,并且没有意识到在代码中的特定位置加载了属性。这是因为它在您使用属性时加载数据 我更喜欢使用显式加载。这样你就知道他们什么时候上膛,在哪里。下面的链接给出了LoadProperty的一个示例 您还可以使用Include方法来加载。这里的示例:对于标量属性,有选择地不加载特定属性的唯一方法是在ESQL或L2E中投影: var q = f

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

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

我更喜欢使用显式加载。这样你就知道他们什么时候上膛,在哪里。下面的链接给出了LoadProperty的一个示例


您还可以使用Include方法来加载。这里的示例:

对于标量属性,有选择地不加载特定属性的唯一方法是在ESQL或L2E中投影:

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

+1至丹;懒散地做这件事比提前加载更糟糕。如果您想控制加载,请明确。

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

希望有帮助

给定对EntityFramework数据库集的查询,其中目标实体包含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调试诊断工具中的内存使用功能对此进行了测试。

stimms和Dan,我不是指相关属性,我指的是一个字段类成员,如C中的传记字符串或SQL Server中的varchar1024,这对实体的加载非常昂贵,我希望在必要时延迟加载它。据我所知,这在EF4中不起作用。有没有办法做到这一点?所以你想延迟加载一个标量属性?在我脑海中,我可能会尝试将传记拆分为它的on实体,并将其设置为导航属性。然后我就可以懒/急/快地加载它了。也许有更好的方法…我会在有机会的时候检验这个理论。谢谢,这似乎是唯一有效的方法。谢谢你的建议。是的,但是这个预测是无效的。首先,它将导致一个匿名类型,不能直接用作人。必须正确地创建和实例化一个新的人员对象,这将浪费在对象之间解析的时间。上下文也无法跟踪此类型。@Nazaf,您正在过早地进行优化。谢谢。我必须这样做。但是EF4应该支持对标量属性的延迟加载,这非常方便。我知道该团队正在下一个版本中支持开箱即用的延迟加载属性,但我确实认为将昂贵的列移动到另一个实体会打开一条途径,一次延迟加载多个昂贵的属性。假设您有一个包含EmployeePicture和employeedescription的employee对象,这两个对象都很昂贵,您希望延迟加载这两个对象,但无论何时加载它们,都希望将它们一起加载。这是在linq to sql中无法做到的。是的,如果有多个昂贵的字段,在这种情况下,EF团队可以启用类似LoadAllLazyProperties的标志,允许EF在请求任何标量属性时一起加载标记为Lazy load的所有标量属性。这改善了您提到的情况,但没有分离EntityTypes!!